#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct seg
{
    int l, r, c;
};
bool right_cmp(const seg &l, const seg &r)
{
    return l.r < r.r;
}
int size_pad(int x)
{
    while(x & (x - 1)) x += x & -x;
    return x;
}
struct segtree
{
    const int size;
    vector<int> data;
    vector<int> lazy;
    int cx;
    segtree(int n) : size(n), data(size * 4 + 1), lazy(size * 4 + 1) {}
    void propg(int id, int leaf)
    {
        if(!leaf){
          data[id << 1] += lazy[id];
          lazy[id << 1] += lazy[id];
          data[id << 1 | 1] += lazy[id];
          lazy[id << 1 | 1] += lazy[id];
        }
        lazy[id] = 0;
    }
    void upd(int id, int l, int r)
    {
        if(r <= cx){
          ++lazy[id];
          ++data[id];
          propg(id, l == r);
          return;
        }
        propg(id, 0);
        int mid = (l + r) >> 1;
        upd(id << 1, l, mid);
        if(cx > mid) upd(id << 1 | 1, mid + 1, r);
        data[id] = max(data[id << 1], data[id << 1 | 1]);
    }
    int get(int id, int l, int r)
    {
        propg(id, l == r);
        if(r <= cx) return data[id];
        int resl = 0, resr = 0;
        int mid = (l + r) >> 1;
        resl = get(id << 1, l, mid);
        if(cx > mid) resr = get(id << 1 | 1, mid + 1, r);
        return max(resl, resr);
    }
    void upd(int x)
    {
        cx = x;
        upd(1, 0, size);
    }
    void set(int x, int v)
    {
        int id = 1, l = 0, r = size;
        while(l != r){
          propg(id, 1);
          int mid = (l + r) >> 1;
          if(x > mid){
            id = id << 1 | 1;
            l = mid + 1;
          }
          else{
            id = id << 1;
            r = mid;
          }
        }
        data[id] = v;
        for(id >>= 1; id; id >>= 1)
          data[id] = max(data[id << 1], data[id << 1 | 1]);
    }
    int get(int x)
    {
        cx = x;
        return get(1, 0, size);
    }
};
#define nmax 200000
int n, s[2][nmax+1], n_[2];
seg a[nmax+1];
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    cin >> n;
    for(int i = 1; i <= n; ++i){
      int l, r, c;
      cin >> l >> r >> c;
      --c;
      a[i] = {l, r, c};
      s[c][++n_[c]] = r;
    }
    segtree sgt[2]{n_[0], n_[1]};
    s[0][0] = s[1][0] = 0;
    std::sort(a + 1, a + n + 1, right_cmp);
    for(int i = 0; i < 2; ++i)
      std::sort(s[i] + 1, s[i] + n_[i] + 1);
    int ans = 0;
    for(int i = 1, c[2]{}; i <= n; ++i){
      ++c[a[i].c];
      int idx = std::lower_bound(s[!a[i].c] + 1, s[!a[i].c] + n_[!a[i].c] + 1, a[i].l) - s[!a[i].c] - 1;
      int tmp = sgt[!a[i].c].get(idx) + 1;
      ans = std::max(ans, tmp);
      sgt[!a[i].c].upd(idx);
      sgt[a[i].c].set(c[a[i].c], tmp);
    }
    cout << ans;
    return 0;
}


#include<bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define eb emplace_back
#define all(v) (v).begin(), (v).end()

using namespace std;
ll seed = time(0);
mt19937 gen(seed);
bool IS_ONE_TEST = 1;
#define maxn 400005
vector<vector<int>> tv(2, vector<int>(4 * maxn)), td(2, vector<int>(4 * maxn));
void push(int u, int v) {
  td[u][2 * v + 1] += td[u][v];
  td[u][2 * v + 2] += td[u][v];
  td[u][v] = 0;
}
int getval(int u, int v) {
  return tv[u][v] + td[u][v];
}
int pull(int u, int v) {
  tv[u][v] = max(getval(u, 2 * v + 1), getval(u, 2 * v + 2));
}
void add_seg(int u, int v, int vl, int vr, int l, int r) {
  if (vl > vr) return;
  if (l <= vl && vr <= r) td[u][v] += 1;
  else if (l > vr || vl > r) return;
  else {
    int vm = (vl + vr) / 2;
    push(u, v);
    add_seg(u, 2 * v + 1, vl, vm, l, r);
    add_seg(u, 2 * v + 2, vm + 1, vr, l, r);
    pull(u, v);
  }
}
int get_max(int u, int v, int vl, int vr, int l, int r) {
  if (l <= vl && vr <= r) return getval(u, v);
  else if (l > vr || vl > r) return 0;
  else {
    int vm = (vl + vr) / 2;
    push(u, v);
    int ret = 0;
    ret = max(ret, get_max(u, 2 * v + 1, vl, vm, l, r));
    ret = max(ret, get_max(u, 2 * v + 2, vm + 1, vr, l, r));
    pull(u, v);
    return ret;
  }
}
void set_elem(int u, int v, int vl, int vr, int idx, int d) {
  if (vl == vr) {
    tv[u][v] = max(getval(u, v), d);
    td[u][v] = 0;
  }
  else {
    int vm = (vl + vr) / 2;
    push(u, v);
    if (idx <= vm) set_elem(u, 2 * v + 1, vl, vm, idx, d);
    else set_elem(u, 2 * v + 2, vm + 1, vr, idx, d);
    tv[u][v] = max(getval(u, 2 * v + 1), getval(u, 2 * v + 2));
    pull(u, v);
  }
}
void solve() {
  int n;
  cin >> n;
  vector<int> v = {0};
  vector<pair<int, int>> a = {{0, 0}}, b = {{0, 0}};
  for (int i = 0; i < n; ++i) {
    int x, y, t;
    cin >> x >> y >> t;
    v.push_back(x);
    v.push_back(y);
    if (t == 1) a.eb(x, y);
    else b.eb(x, y);
  }
  sort(v.begin(), v.end());
  v.erase(unique(all(v)), v.end());
  for (auto &c : a) c.fi = lower_bound(all(v), c.fi) - v.begin();
  for (auto &c : a) c.se = lower_bound(all(v), c.se) - v.begin();
  for (auto &c : b) c.fi = lower_bound(all(v), c.fi) - v.begin();
  for (auto &c : b) c.se = lower_bound(all(v), c.se) - v.begin();
  map<int, vector<pair<int, int>>> mp;
  for (auto &c : a) mp[c.se].emplace_back(c.fi, 0);
  for (auto &c : b) mp[c.se].emplace_back(c.fi, 1);
  int tot = 0;
  for (int i = 1; i < maxn; ++i) {
    for (auto &c : mp[i]) {
      int x = c.fi, t = c.se;
      add_seg(t ^ 1, 0, 0, maxn - 1, 0, x - 1);
    }
    for (auto &c : mp[i]) {
      int x = c.fi, t = c.se;
      int res = get_max(t ^ 1, 0, 0, maxn - 1, 0, maxn - 1);
      set_elem(t, 0, 0, maxn - 1, i, res);
    }
  }
  cout << max(get_max(0, 0, 0, maxn - 1, 0, maxn - 1), get_max(1, 0, 0, maxn - 1, 0, maxn - 1)) << endl;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
  srand(time(0));
  int T = 1;
  if (!IS_ONE_TEST) cin >> T;
  while (T-->0) solve();
}


// Problem : F. Bicolored Segments
// Contest : Codeforces - Educational Codeforces Round 92 (Rated for Div. 2)
// URL : https://codeforces.com/contest/1389/problem/F
// Memory Limit : 256 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>

using namespace std;

int N;
int bit[2][500005];
const int oo = INT_MAX/2;
vector<int> cmp[2];
pair<pair<int, int>, int> arr[200005];

int getidx(int t, int n){
	return upper_bound(cmp[t].begin(), cmp[t].end(), n) - cmp[t].begin();
}

void upd(int t, int n, int v){
	while(n <= 2*N+1){
		bit[t][n] = max(bit[t][n], v);
		n += n&-n;
	}
}

int query(int t, int n){
	int ret = 0;
	while(n){
		ret = max(ret, bit[t][n]);
		n -= n&-n;
	}
	return ret;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> N;
	for(int i = 1; i<=N; i++){
		int l, r, t;
		cin >> l >> r >> t;
		cmp[(t == 1 ? 0 : 1)].push_back(l);
		cmp[(t == 1 ? 0 : 1)].push_back(r);
		arr[i].first = make_pair(r, l);
		arr[i].second = (t == 1 ? 0 : 1);
	}
	sort(cmp[0].begin(), cmp[0].end());
	sort(cmp[1].begin(), cmp[1].end());
	cmp[0].erase(unique(cmp[0].begin(), cmp[0].end()), cmp[0].end());
	cmp[1].erase(unique(cmp[1].begin(), cmp[1].end()), cmp[1].end());
	int ans = 0;
	sort(arr+1, arr+1+N);
	for(int i = 1; i<=N; i++){
		swap(arr[i].first.second, arr[i].first.first);
		//cout << i << endl;
		int idx1 = getidx(arr[i].second, arr[i].first.second);
		//cout << idx1 << endl;
		int opt1 = query(arr[i].second, idx1);
		//cout << opt1 << endl;
		int idx2 = getidx(arr[i].second^1, arr[i].first.first-1);
		//cout << idx2 << endl;
		int opt2 = query(arr[i].second^1, idx2);
		ans = max(ans, max(opt1, opt2) + 1);
		upd(arr[i].second, idx1, max(opt1, opt2) + 1);
		//cout << "here" << endl;
	}
	cout << ans << "\n";
}


// Problem : F. Bicolored Segments
// Contest : Codeforces - Educational Codeforces Round 92 (Rated for Div. 2)
// URL : https://codeforces.com/contest/1389/problem/F
// Memory Limit : 256 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>

using namespace std;

struct SegmentTree{
	struct Node{
		int l, r;
		int mx, lzy;
	};
	Node seg[2000000];

	void build(int l, int r, int idx){
		seg[idx].l = l, seg[idx].r = r;
		if(l == r){
			return;
		}
		int mid = l+r>>1;
		build(l, mid, 2*idx);
		build(mid+1, r, 2*idx+1);
	}
	void pd(int idx){
		if(seg[idx].lzy){
			seg[2*idx].lzy += seg[idx].lzy;
			seg[2*idx+1].lzy += seg[idx].lzy;
			seg[2*idx].mx += seg[idx].lzy;
			seg[2*idx+1].mx += seg[idx].lzy;
			seg[idx].lzy = 0;
		}
	}
	void upd(int l, int r, int v, int idx){
		if(seg[idx].l == l && seg[idx].r == r){
			seg[idx].mx += v;
			seg[idx].lzy += v;
			return;
		}
		pd(idx);
		int mid = seg[idx].l + seg[idx].r >> 1;
		if(r <= mid){
			upd(l, r, v, 2*idx);
		}
		else if(l > mid){
			upd(l, r, v, 2*idx+1);
		}
		else{
			upd(l, mid, v, 2*idx);
			upd(mid+1, r, v, 2*idx+1);
		}
		seg[idx].mx = max(seg[2*idx].mx, seg[2*idx+1].mx);
	}
	void st(int p, int v, int idx){
		if(seg[idx].l == seg[idx].r){
			seg[idx].mx = max(seg[idx].mx, v);
			return;
		}
		pd(idx);
		int mid = seg[idx].l + seg[idx].r >> 1;
		if(p <= mid){
			st(p, v, 2*idx);
		}
		else{
			st(p, v, 2*idx+1);
		}
		seg[idx].mx = max(seg[2*idx].mx, seg[2*idx+1].mx);
	}

} tree[2];

int N;
const int oo = INT_MAX/2;
vector<int> cmp[2];
pair<pair<int, int>, int> arr[200005];

int getidx(int t, int n){
	return upper_bound(cmp[t].begin(), cmp[t].end(), n) - cmp[t].begin();
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> N;
	for(int i = 1; i<=N; i++){
		int l, r, t;
		cin >> l >> r >> t;
		cmp[(t == 1 ? 0 : 1)].push_back(l);
		cmp[(t == 1 ? 0 : 1)].push_back(r);
		arr[i].first = make_pair(r, l);
		arr[i].second = (t == 1 ? 0 : 1);
	}
	cmp[0].push_back(0);
	cmp[1].push_back(0);
	sort(cmp[0].begin(), cmp[0].end());
	sort(cmp[1].begin(), cmp[1].end());
	cmp[0].erase(unique(cmp[0].begin(), cmp[0].end()), cmp[0].end());
	cmp[1].erase(unique(cmp[1].begin(), cmp[1].end()), cmp[1].end());
	int ans = 0;
	sort(arr+1, arr+1+N);
	tree[0].build(1, cmp[0].size(), 1);
	tree[1].build(1, cmp[1].size(), 1);
	for(int i = 1; i<=N; i++){
		swap(arr[i].first.second, arr[i].first.first);
		int rhtidx = getidx(arr[i].second, arr[i].first.second);
		int lftidx = getidx(arr[i].second^1, arr[i].first.first-1);
		tree[arr[i].second^1].upd(1, lftidx, 1, 1);
		int v = tree[arr[i].second^1].seg[1].mx;
		tree[arr[i].second].st(rhtidx, v, 1);
		ans = max(ans, v);
	}
	cout << ans << "\n";
}


#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
using namespace std;
template<typename T> void read(T &num){
	char c=getchar();T f=1;num=0;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	num*=f;
}
template<typename T> void qwq(T x){
	if(x>9)qwq(x/10);
	putchar(x%10+'0');
}
template<typename T> void write(T x){
	if(x<0){x=-x;putchar('-');}
	qwq(x);putchar('\n');
}
struct wzy{
	int li,ri,ti;
}co[200010];
struct hry{
	int pos,tmp,num;
}w[400010];
inline bool cmp(hry a,hry b){
	return (a.pos==b.pos)?a.tmp>b.tmp:a.pos<b.pos;
}
multiset<int>v[3];

int main(){
	int n;read(n);int len=0;
	rep(i,1,n){
		read(co[i].li);read(co[i].ri);read(co[i].ti);
		w[++len]={co[i].li,1,i};w[++len]={co[i].ri,-1,i};
	}
	sort(w+1,w+len+1,cmp);

	int ans=0;
	rep(i,1,len){
		int col=co[w[i].num].ti;
		if(w[i].tmp==1){v[col].insert(co[w[i].num].ri);}
		else{
			int n1=(!v[3-col].empty());int n2=(v[col].count(w[i].pos)!=0);
			if(!n1){
				if(n2)v[col].erase(v[col].find(w[i].pos));
				continue;
			}
			if(n2){
				ans++;v[col].erase(v[col].find(w[i].pos));
				v[3-col].erase(v[3-col].begin());
			}
		}
	}
	write(n-ans);
	return 0;
}


#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rep2(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
template<typename T> void read(T &num){
	char c=getchar();T f=1;num=0;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	num*=f;
}
template<typename T> void qwq(T x){
	if(x>9)qwq(x/10);
	putchar(x%10+'0');
}
template<typename T> void write(T x){
	if(x<0){x=-x;putchar('-');}
	qwq(x);putchar('\n');
}
struct wzy{
	int li,ri,ti;
}co[200010];
struct hry{
	int pos,tmp,num;
}w[400010];
inline bool cmp(hry a,hry b){
	return (a.pos==b.pos)?a.tmp>b.tmp:a.pos<b.pos;
}
multiset<int>v[3];

int main(){
	int n;read(n);int len=0;
	rep(i,1,n){
		read(co[i].li);read(co[i].ri);read(co[i].ti);
		w[++len]={co[i].li,1,i};w[++len]={co[i].ri,-1,i};
	}
	sort(w+1,w+len+1,cmp);

	int ans=0;
	rep(i,1,len){
		int col=co[w[i].num].ti;
		if(w[i].tmp==1){v[col].insert(co[w[i].num].ri);}
		else{
			if(v[3-col].empty()){
				if(v[col].count(w[i].pos))v[col].erase(v[col].find(w[i].pos));
				continue;
			}
			if(v[col].count(w[i].pos)){
				ans++;v[col].erase(v[col].find(w[i].pos));
				v[3-col].erase(v[3-col].begin());
			}
		}
	}
	write(n-ans);
	return 0;
}


#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rep2(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
template<typename T> void read(T &num){
	char c=getchar();T f=1;num=0;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	num*=f;
}
template<typename T> void qwq(T x){
	if(x>9)qwq(x/10);
	putchar(x%10+'0');
}
template<typename T> void write(T x){
	if(x<0){x=-x;putchar('-');}
	qwq(x);putchar('\n');
}
struct wzy{
	int li,ri,ti;
}co[200010];
struct hry{
	int pos,tmp,num;
}w[400010];
inline bool cmp(hry a,hry b){
	return (a.pos==b.pos)?a.tmp>b.tmp:a.pos<b.pos;
}
set<int>v[3];

int main(){
	int n;read(n);int len=0;
	rep(i,1,n){
		read(co[i].li);read(co[i].ri);read(co[i].ti);
		w[++len]={co[i].li,1,i};w[++len]={co[i].ri,-1,i};
	}
	sort(w+1,w+len+1,cmp);

	int ans=0;
	rep(i,1,len){
		int col=co[w[i].num].ti;
		if(w[i].tmp==1){v[col].insert(co[w[i].num].ri);}
		else{
			if(v[3-col].empty()){
				if(v[col].find(w[i].pos)!=v[col].end())v[col].erase(v[col].find(w[i].pos));
				continue;
			}
			if(v[col].find(w[i].pos)!=v[col].end()){
				ans++;v[col].erase(v[col].find(w[i].pos));
				v[3-col].erase(v[3-col].begin());
			}
		}
	}
	write(n-ans);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

#define x first
#define y second
#define pb push_back
#define mp make_pair
#define all(a) (a).begin(), (a).end()
#define forn(i, n) for (int i = 0; i < int(n); ++i)

typedef pair<int, int> pt;

const int N = 200 * 1000;

int n;
int l[N], r[N], t[N];
set<pair<int,int> > st[2];

int main() {
	scanf("%d", &n);
	for(int i=0;i<n;i++) scanf("%d%d%d", &l[i], &r[i], &t[i]), --t[i];

	vector<pair<int, pair<int,int>>> ev;
	for(int i=0;i< n;i++) {
		ev.pb(make_pair(l[i], make_pair(0, i)));
		ev.pb(make_pair(r[i], make_pair(1, i)));
	}

	sort(ev.begin(),ev.end());

	int ans = 0;
	for (auto it : ev) {
		int i = it.y.y;
		if (it.y.x) {
			int j = t[i];
			int k = j ^ 1;
			if (st[j].count(mp(r[i], i)) && !st[k].empty()) {
				++ans;
				st[k].erase(st[k].begin());
			}
			if (st[j].count(mp(r[i], i))) st[t[i]].erase(mp(r[i], i));
		} else {
			st[t[i]].insert(mp(r[i], i));
		}
	}

	printf("%d\n", n - ans);
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=4e5+5;
struct Node{
    int l,r,t;
}e[maxm];
int n;
//
struct Tree{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
    int ask(int st,int ed,int l,int r,int node){
        if(st<=l&&ed>=r)return a[node];
        pushdown(node);
        int mid=(l+r)/2;
        int ans=0;
        if(st<=mid)ans=max(ans,ask(st,ed,l,mid,node*2));
        if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,node*2+1));
        return ans;
    }
}t1,t2;
//
vector<int>p1[maxm];//存红色
vector<int>p2[maxm];//存蓝色
bool cmp(int a,int b){
    return a>b;
}
//
int d[maxm];
int f[maxm];
int g[maxm];
//
int b[maxm],num;
//
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].l>>e[i].r>>e[i].t;
        b[++num]=e[i].l,b[++num]=e[i].r;
    }
    //
    sort(b+1,b+1+num);
    num=unique(b+1,b+1+num)-b-1;
    for(int i=1;i<=n;i++){
        e[i].l=lower_bound(b+1,b+1+num,e[i].l)-b;
        e[i].r=lower_bound(b+1,b+1+num,e[i].r)-b;
    }
    //
//    cout<<endl;//
    //
    for(int i=1;i<=n;i++){
//        cout<<e[i].l<<' '<<e[i].r<<' '<<e[i].t<<endl;
        if(e[i].t==1){
            p1[e[i].r].push_back(e[i].l);
        }else{
            p2[e[i].r].push_back(e[i].l);
        }
    }
    for(int i=1;i<=num;i++){
        sort(p1[i].begin(),p1[i].end(),cmp);
        sort(p2[i].begin(),p2[i].end(),cmp);
    }
    //
//    cout<<endl;//
    //
    for(int i=1;i<=num;i++){
        d[i]=d[i-1];
        f[i]=f[i-1]+(int)p1[i].size();
        g[i]=g[i-1]+(int)p2[i].size();
        d[i]=max(d[i],f[i]);
        d[i]=max(d[i],g[i]);
        for(int j=0;j<(int)p1[i].size();j++){
            int l=p1[i][j];
            t1.update(0,l,1,0,num,1);
            d[i]=max(d[i],d[l-1]+t1.ask(l-1,i,1,num,1));
        }
        for(int j=0;j<(int)p2[i].size();j++){
            int l=p2[i][j];
            t2.update(0,l,1,0,num,1);
            d[i]=max(d[i],d[l-1]+t2.ask(l-1,i,1,num,1));
        }
//        cout<<i<<' '<<d[i]<<endl;
    }
    cout<<d[num]<<endl;
    return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=4e5+5;
struct Node{
    int l,r,t;
}e[maxm];
int n;
//
struct Tree{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
    int ask(int st,int ed,int l,int r,int node){
        if(st<=l&&ed>=r)return a[node];
        pushdown(node);
        int mid=(l+r)/2;
        int ans=0;
        if(st<=mid)ans=max(ans,ask(st,ed,l,mid,node*2));
        if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,node*2+1));
        return ans;
    }
}t1,t2;
//
vector<int>p1[maxm];//存红色
vector<int>p2[maxm];//存蓝色
bool cmp(int a,int b){
    return a>b;
}
//
int d[maxm];
int f[maxm];
int g[maxm];
//
int b[maxm],num;
//
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].l>>e[i].r>>e[i].t;
        b[++num]=e[i].l,b[++num]=e[i].r;
    }
    //
    sort(b+1,b+1+num);
    num=unique(b+1,b+1+num)-b-1;
    for(int i=1;i<=n;i++){
        e[i].l=lower_bound(b+1,b+1+num,e[i].l)-b;
        e[i].r=lower_bound(b+1,b+1+num,e[i].r)-b;
    }
    for(int i=1;i<=n;i++){
        if(e[i].t==1){
            p1[e[i].r].push_back(e[i].l);
        }else{
            p2[e[i].r].push_back(e[i].l);
        }
    }
    for(int i=1;i<=num;i++){
        sort(p1[i].begin(),p1[i].end(),cmp);
        sort(p2[i].begin(),p2[i].end(),cmp);
    }
    for(int i=1;i<=num;i++){
        d[i]=d[i-1];
//        f[i]=f[i-1]+(int)p1[i].size();
//        g[i]=g[i-1]+(int)p2[i].size();
//        d[i]=max(d[i],f[i]);
//        d[i]=max(d[i],g[i]);
        for(int j=0;j<(int)p1[i].size();j++){
            int l=p1[i][j];
            t1.update(0,l-1,1,0,num,1);
            d[i]=max(d[i],t1.ask(0,l-1,0,num,1));
        }
        for(int j=0;j<(int)p2[i].size();j++){
            int l=p2[i][j];
            t2.update(0,l-1,1,0,num,1);
            d[i]=max(d[i],t2.ask(0,l-1,0,num,1));
        }
        t1.update(i,i,d[i],0,num,1);
        t2.update(i,i,d[i],0,num,1);
    }
    cout<<d[num]<<endl;
    return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=4e5+5;
struct Node{
    int l,r,t;
}e[maxm];
int n;
//
struct Tree{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
    int ask(int st,int ed,int l,int r,int node){
        if(st<=l&&ed>=r)return a[node];
        pushdown(node);
        int mid=(l+r)/2;
        int ans=0;
        if(st<=mid)ans=max(ans,ask(st,ed,l,mid,node*2));
        if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,node*2+1));
        return ans;
    }
}t1,t2;
//
vector<int>p1[maxm];//存红色
vector<int>p2[maxm];//存蓝色
bool cmp(int a,int b){
    return a>b;
}
//
int d[maxm];
int f[maxm];
int g[maxm];
//
int b[maxm],num;
//
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].l>>e[i].r>>e[i].t;
        b[++num]=e[i].l,b[++num]=e[i].r;
    }
    //
    sort(b+1,b+1+num);
    num=unique(b+1,b+1+num)-b-1;
    for(int i=1;i<=n;i++){
        e[i].l=lower_bound(b+1,b+1+num,e[i].l)-b;
        e[i].r=lower_bound(b+1,b+1+num,e[i].r)-b;
    }
    //
//    cout<<endl;//
    //
    for(int i=1;i<=n;i++){
//        cout<<e[i].l<<' '<<e[i].r<<' '<<e[i].t<<endl;
        if(e[i].t==1){
            p1[e[i].r].push_back(e[i].l);
        }else{
            p2[e[i].r].push_back(e[i].l);
        }
    }
    for(int i=1;i<=num;i++){
        sort(p1[i].begin(),p1[i].end(),cmp);
        sort(p2[i].begin(),p2[i].end(),cmp);
    }
    //
//    cout<<endl;//
    //
    for(int i=1;i<=num;i++){
        d[i]=d[i-1];
        f[i]=f[i-1]+(int)p1[i].size();
        g[i]=g[i-1]+(int)p2[i].size();
        d[i]=max(d[i],f[i]);
        d[i]=max(d[i],g[i]);
        for(int j=0;j<(int)p1[i].size();j++){
            int l=p1[i][j];
            t1.update(0,l,1,0,num,1);
            d[i]=max(d[i],d[l-1]+t1.ask(l,i,0,num,1));
        }
        for(int j=0;j<(int)p2[i].size();j++){
            int l=p2[i][j];
            t2.update(0,l,1,0,num,1);
            d[i]=max(d[i],d[l-1]+t2.ask(l,i,0,num,1));
        }
//        cout<<i<<' '<<d[i]<<endl;
    }
    cout<<d[num]<<endl;
    return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=4e5+5;
struct Node{
    int l,r,t;
}e[maxm];
int n;
//
struct Tree{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
    int ask(int st,int ed,int l,int r,int node){
        if(st<=l&&ed>=r)return a[node];
        pushdown(node);
        int mid=(l+r)/2;
        int ans=0;
        if(st<=mid)ans=max(ans,ask(st,ed,l,mid,node*2));
        if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,node*2+1));
        return ans;
    }
}t1,t2;
//
vector<int>p1[maxm];//存红色
vector<int>p2[maxm];//存蓝色
bool cmp(int a,int b){
    return a>b;
}
//
int d[maxm];
int f[maxm];
int g[maxm];
//
int b[maxm],num;
//
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].l>>e[i].r>>e[i].t;
        b[++num]=e[i].l,b[++num]=e[i].r;
    }
    //
    sort(b+1,b+1+num);
    num=unique(b+1,b+1+num)-b-1;
    for(int i=1;i<=n;i++){
        e[i].l=lower_bound(b+1,b+1+num,e[i].l)-b;
        e[i].r=lower_bound(b+1,b+1+num,e[i].r)-b;
    }
    //
//    cout<<endl;//
    //
    for(int i=1;i<=n;i++){
//        cout<<e[i].l<<' '<<e[i].r<<' '<<e[i].t<<endl;
        if(e[i].t==1){
            p1[e[i].r].push_back(e[i].l);
        }else{
            p2[e[i].r].push_back(e[i].l);
        }
    }
    for(int i=1;i<=num;i++){
        sort(p1[i].begin(),p1[i].end(),cmp);
        sort(p2[i].begin(),p2[i].end(),cmp);
    }
    //
//    cout<<endl;//
    //
    for(int i=1;i<=num;i++){
        d[i]=d[i-1];
        f[i]=f[i-1]+(int)p1[i].size();
        g[i]=g[i-1]+(int)p2[i].size();
        d[i]=max(d[i],f[i]);
        d[i]=max(d[i],g[i]);
        for(int j=0;j<(int)p1[i].size();j++){
            int l=p1[i][j];
            t1.update(0,l,1,0,num,1);
            d[i]=max(d[i],d[l-1]+t1.ask(l,i,1,num,1));
        }
        for(int j=0;j<(int)p2[i].size();j++){
            int l=p2[i][j];
            t2.update(0,l,1,0,num,1);
            d[i]=max(d[i],d[l-1]+t2.ask(l,i,1,num,1));
        }
//        cout<<i<<' '<<d[i]<<endl;
    }
    cout<<d[num]<<endl;
    return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=4e5+5;
struct Node{
    int l,r,t;
}e[maxm];
int n;
//
struct Tree{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
    int ask(int st,int ed,int l,int r,int node){
        if(st<=l&&ed>=r)return a[node];
        pushdown(node);
        int mid=(l+r)/2;
        int ans=0;
        if(st<=mid)ans=max(ans,ask(st,ed,l,mid,node*2));
        if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,node*2+1));
        return ans;
    }
}t1,t2;
//
vector<int>p1[maxm];//存红色
vector<int>p2[maxm];//存蓝色
//
int d[maxm];
//
int b[maxm],num;
//
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].l>>e[i].r>>e[i].t;
        b[++num]=e[i].l,b[++num]=e[i].r;
    }
    //
    sort(b+1,b+1+num);
    num=unique(b+1,b+1+num)-b-1;
    for(int i=1;i<=n;i++){
        e[i].l=lower_bound(b+1,b+1+num,e[i].l)-b;
        e[i].r=lower_bound(b+1,b+1+num,e[i].r)-b;
    }
    for(int i=1;i<=n;i++){
        if(e[i].t==1){
            p1[e[i].r].push_back(e[i].l);
        }else{
            p2[e[i].r].push_back(e[i].l);
        }
    }
    //
    for(int i=1;i<=num;i++){
        for(int j=0;j<(int)p1[i].size();j++){
            int l=p1[i][j];
            t1.update(0,l-1,1,0,num,1);
        }
        for(int j=0;j<(int)p2[i].size();j++){
            int l=p2[i][j];
            t2.update(0,l-1,1,0,num,1);
        }
        d[i]=max(d[i],t1.ask(0,i-1,0,num,1));
        d[i]=max(d[i],t2.ask(0,i-1,0,num,1));
        t1.update(i,i,d[i],0,num,1);
        t2.update(i,i,d[i],0,num,1);
    }
    cout<<d[num]<<endl;
    return 0;
}
/*

*/


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=4e5+5;
struct Node{
    int l,r,t;
}e[maxm];
int n;
//
struct Tree{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
    int ask(int st,int ed,int l,int r,int node){
        if(st<=l&&ed>=r)return a[node];
        pushdown(node);
        int mid=(l+r)/2;
        int ans=0;
        if(st<=mid)ans=max(ans,ask(st,ed,l,mid,node*2));
        if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,node*2+1));
        return ans;
    }
}t1,t2;
//
vector<int>p1[maxm];//存红色
vector<int>p2[maxm];//存蓝色
//bool cmp(int a,int b){
//    return a>b;
//}
//
int d[maxm];
//
int b[maxm],num;
//
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].l>>e[i].r>>e[i].t;
        b[++num]=e[i].l,b[++num]=e[i].r;
    }
    //
    sort(b+1,b+1+num);
    num=unique(b+1,b+1+num)-b-1;
    for(int i=1;i<=n;i++){
        e[i].l=lower_bound(b+1,b+1+num,e[i].l)-b;
        e[i].r=lower_bound(b+1,b+1+num,e[i].r)-b;
    }
    for(int i=1;i<=n;i++){
        if(e[i].t==1){
            p1[e[i].r].push_back(e[i].l);
        }else{
            p2[e[i].r].push_back(e[i].l);
        }
    }
//    for(int i=1;i<=num;i++){
//        sort(p1[i].begin(),p1[i].end(),cmp);
//        sort(p2[i].begin(),p2[i].end(),cmp);
//    }
    for(int i=1;i<=num;i++){
        for(int j=0;j<(int)p1[i].size();j++){
            int l=p1[i][j];
            t1.update(0,l-1,1,0,num,1);
        }
        for(int j=0;j<(int)p2[i].size();j++){
            int l=p2[i][j];
            t2.update(0,l-1,1,0,num,1);
        }
        d[i]=max(d[i],t1.ask(0,i,0,num,1));
        d[i]=max(d[i],t2.ask(0,i,0,num,1));
        t1.update(i,i,d[i],0,num,1);
        t2.update(i,i,d[i],0,num,1);
    }
    cout<<d[num]<<endl;
    return 0;
}
/*

*/


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=4e5+5;
struct Node{
    int l,r,t;
}e[maxm];
int n;
//
struct Tree{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
    int ask(int st,int ed,int l,int r,int node){
        if(st<=l&&ed>=r)return a[node];
        pushdown(node);
        int mid=(l+r)/2;
        int ans=0;
        if(st<=mid)ans=max(ans,ask(st,ed,l,mid,node*2));
        if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,node*2+1));
        return ans;
    }
}t1,t2;
//
vector<int>p1[maxm];//存红色
vector<int>p2[maxm];//存蓝色
bool cmp(int a,int b){
    return a>b;
}
//
int d[maxm];
//
int b[maxm],num;
//
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].l>>e[i].r>>e[i].t;
        b[++num]=e[i].l,b[++num]=e[i].r;
    }
    //
    sort(b+1,b+1+num);
    num=unique(b+1,b+1+num)-b-1;
    for(int i=1;i<=n;i++){
        e[i].l=lower_bound(b+1,b+1+num,e[i].l)-b;
        e[i].r=lower_bound(b+1,b+1+num,e[i].r)-b;
    }
    for(int i=1;i<=n;i++){
        if(e[i].t==1){
            p1[e[i].r].push_back(e[i].l);
        }else{
            p2[e[i].r].push_back(e[i].l);
        }
    }
    for(int i=1;i<=num;i++){
        sort(p1[i].begin(),p1[i].end(),cmp);
        sort(p2[i].begin(),p2[i].end(),cmp);
    }
    for(int i=1;i<=num;i++){
        d[i]=d[i-1];
        for(int j=0;j<(int)p1[i].size();j++){
            int l=p1[i][j];
            t1.update(0,l-1,1,0,num,1);
//            d[i]=max(d[i],t1.ask(0,l-1,0,num,1));
        }
        for(int j=0;j<(int)p2[i].size();j++){
            int l=p2[i][j];
            t2.update(0,l-1,1,0,num,1);
//            d[i]=max(d[i],t2.ask(0,l-1,0,num,1));
        }
        d[i]=max(d[i],t1.ask(0,i,0,num,1));
        d[i]=max(d[i],t2.ask(0,i,0,num,1));
        t1.update(i,i,d[i],0,num,1);
        t2.update(i,i,d[i],0,num,1);
    }
    cout<<d[num]<<endl;
    return 0;
}
/*

*/


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=4e5+5;
struct Node{
    int l,r,t;
}e[maxm];
int n;
//
struct Tree{
    int a[maxm<<2];
    int laz[maxm<<2];
    void pushup(int node){
        a[node]=max(a[node*2],a[node*2+1]);
    }
    void pushdown(int node){
        if(laz[node]){
            laz[node*2]+=laz[node];
            laz[node*2+1]+=laz[node];
            a[node*2]+=laz[node];
            a[node*2+1]+=laz[node];
            laz[node]=0;
        }
    }
    void update(int st,int ed,int val,int l,int r,int node){
        if(st<=l&&ed>=r){
            a[node]+=val;
            laz[node]+=val;
            return ;
        }
        pushdown(node);
        int mid=(l+r)/2;
        if(st<=mid)update(st,ed,val,l,mid,node*2);
        if(ed>mid)update(st,ed,val,mid+1,r,node*2+1);
        pushup(node);
    }
    int ask(int st,int ed,int l,int r,int node){
        if(st<=l&&ed>=r)return a[node];
        pushdown(node);
        int mid=(l+r)/2;
        int ans=0;
        if(st<=mid)ans=max(ans,ask(st,ed,l,mid,node*2));
        if(ed>mid)ans=max(ans,ask(st,ed,mid+1,r,node*2+1));
        return ans;
    }
}t1,t2;
//
vector<int>p1[maxm];//存红色
vector<int>p2[maxm];//存蓝色
bool cmp(int a,int b){
    return a>b;
}
//
int d[maxm];
int f[maxm];
int g[maxm];
//
int b[maxm],num;
//
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>e[i].l>>e[i].r>>e[i].t;
        b[++num]=e[i].l,b[++num]=e[i].r;
    }
    //
    sort(b+1,b+1+num);
    num=unique(b+1,b+1+num)-b-1;
    for(int i=1;i<=n;i++){
        e[i].l=lower_bound(b+1,b+1+num,e[i].l)-b;
        e[i].r=lower_bound(b+1,b+1+num,e[i].r)-b;
    }
    //
//    cout<<endl;//
    //
    for(int i=1;i<=n;i++){
//        cout<<e[i].l<<' '<<e[i].r<<' '<<e[i].t<<endl;
        if(e[i].t==1){
            p1[e[i].r].push_back(e[i].l);
        }else{
            p2[e[i].r].push_back(e[i].l);
        }
    }
    for(int i=1;i<=num;i++){
        sort(p1[i].begin(),p1[i].end(),cmp);
        sort(p2[i].begin(),p2[i].end(),cmp);
    }
    //
//    cout<<endl;//
    //
    for(int i=1;i<=num;i++){
        d[i]=d[i-1];
        f[i]=f[i-1]+(int)p1[i].size();
        g[i]=g[i-1]+(int)p2[i].size();
        d[i]=max(d[i],f[i]);
        d[i]=max(d[i],g[i]);
        for(int j=0;j<(int)p1[i].size();j++){
            int l=p1[i][j];
            t1.update(0,l-1,1,0,num,1);
            d[i]=max(d[i],t1.ask(0,l-1,0,num,1));
        }
        for(int j=0;j<(int)p2[i].size();j++){
            int l=p2[i][j];
            t2.update(0,l-1,1,0,num,1);
            d[i]=max(d[i],t2.ask(0,l-1,0,num,1));
        }
        t1.update(i,i,d[i],0,num,1);
        t2.update(i,i,d[i],0,num,1);
//        cout<<i<<' '<<d[i]<<endl;
    }
    cout<<d[num]<<endl;
    return 0;
}


#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void rd(T &x)
{
	x=0;bool f=0;char c=getchar();
	while(!isdigit(c)) {if(c=='-') f=1;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	if(f) x=-x;
}
const int N=2e5+5;
int n,an,bn;
struct node
{
	int l,r;
}a[N],b[N];
inline bool cmp(node a,node b) {return a.r<b.r;}

int main()
{
	rd(n);
	for(int i=1;i<=n;i++)
	{
		int l,r,t;
		rd(l),rd(r),rd(t);
		if(t==1) a[++an]=(node){l,r};
		else b[++bn]=(node){l,r};
	}
	sort(a+1,a+an+1,cmp);
	sort(b+1,b+bn+1,cmp);
	int ans=0,i=1,j=1,last_r=0,last_t=-1;
	while(1)
	{
//		printf("%d %d\n",i,j);
//		system("pause");
		bool flag=0;
		if(i<=an && (j>bn || a[i].r<b[j].r))
		{
			if(last_t==2)
			{
				if(last_r<a[i].l) ans++,last_t=1,last_r=a[i].r;
			}
			else ans++,last_t=1,last_r=a[i].r;
			i++,flag=1;
		}
		else if(j<=bn)
		{
			if(last_t==1)
			{
				if(last_r<b[j].l) ans++,last_t=2,last_r=b[j].r;
			}
			else ans++,last_t=2,last_r=b[j].r;
			j++,flag=1;
		}
		if(!flag) break;
//		printf("%d\n",ans);
	}
	printf("%d\n",ans);
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void rd(T &x)
{
	x=0;bool f=0;char c=getchar();
	while(!isdigit(c)) {if(c=='-') f=1;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	if(f) x=-x;
}
const int N=2e5+5;
int n;
struct node
{
	int l,r,t;
}a[N];
inline bool cmp(node a,node b) {return a.r==b.r?a.l<b.l:a.r<b.r;}
multiset<int>st[2];

int main()
{
	rd(n);
	for(int i=1;i<=n;i++)
		rd(a[i].l),rd(a[i].r),rd(a[i].t),a[i].t--;
	sort(a+1,a+n+1,cmp);
	int ans=n;
	for(int i=1;i<=n;i++)
		if(st[!a[i].t].lower_bound(a[i].l)==st[!a[i].t].end()) st[a[i].t].insert(a[i].r);
		else st[!a[i].t].erase(st[!a[i].t].lower_bound(a[i].l)),ans--;
	printf("%d\n",ans);
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5;
const int mod=1e9+7;
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
typedef long long ll;
typedef double db;
typedef vector<int> vi;
typedef pair<int,int> pii;
ll qpow(ll a,ll b){ll ans=1;a%=mod;assert(b>=0);for(;b;b>>=1){if(b&1)ans=ans*a%mod;a=a*a%mod;}return ans;}
ll gcd(ll a,ll b){return b>0?gcd(b,a%b):a;}
int n,m,T;
int a[maxn];
vector<pii> v[maxn];
vi base;
#define lson rt<<1
#define rson rt<<1|1
struct node{
    int tr[maxn<<2];
    int lz[maxn<<2];
    void pushdown(int rt){
        if(lz[rt]){
            lz[lson]+= lz[rt];
            lz[rson]+= lz[rt];
            tr[lson]+= lz[rt];
            tr[rson]+= lz[rt];
            lz[rt]=0;
        }
    }
    void update(int C,int L,int R,int l,int r,int rt){
        if(r<L||R<l) return;
        if(L<=l&&r<=R){
            tr[rt]+= C;
            lz[rt]+= C;
            return ;
        }
        pushdown(rt);
        int mid= l+r>>1;
        update(C, L, R, l, mid, lson);
        update(C, L, R, mid+1, r, rson);
        tr[rt]= max(tr[lson], tr[rson]);
    }
    int query(int L,int R,int l,int r,int rt){
        if(r<L||R<=l) return 0;
        if(L<=l&&r<=R){
            return tr[rt];
        }
        int mid= l+r>>1;
        pushdown(rt);
        return max(query(L,R,l,mid,lson),query(L,R,mid+1,r,rson));
    }
}t[2];
int dp[maxn][2];
int getId(int x){
    return lower_bound(all(base),x)-base.begin()+1;
}
struct Query{
    int l,r,t;
}q[maxn];
int main() {
    scanf("%d",&n);
    base.pb(0);
    for(int t,l,r,i=1;i<=n;i++){
        scanf("%d%d%d",&l,&r,&t);
        q[i]={l,r,t-1};
        base.pb(l);
        base.pb(r);
    }
    sort(all(base));
    base.erase(unique(all(base)),base.end());
    for(int i=1;i<=n;i++){
        q[i].l= getId(q[i].l);
        q[i].r= getId(q[i].r);
        v[q[i].r-1].pb({q[i].l, q[i].t});
    }
    int ans=0;
    for(int i=0; i<base.size(); i++){
        for(auto p: v[i]){
            t[p.se].update(1,1,p.fi-1,1,base.size(),1);
        }
        dp[i][0]= t[1].query(1,i+1,1,n,1);
        dp[i][1]= t[0].query(1,i+1,1,n,1);
        t[0].update(dp[i][0],i+1,i+1,1,base.size(),1);
        t[1].update(dp[i][1],i+1,i+1,1,base.size(),1);
        ans=max(ans, max(dp[i][0], dp[i][1]));
    }
    printf("%d\n",ans);
    //cin>>n>>m;
    return 0;
}
/*
7
19 20 1
13 15 2
6 11 2
4 10 1
14 17 1
13 13 2
5 9 1

*/


#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5;
const int mod=1e9+7;
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
typedef long long ll;
typedef double db;
typedef vector<int> vi;
typedef pair<int,int> pii;
ll qpow(ll a,ll b){ll ans=1;a%=mod;assert(b>=0);for(;b;b>>=1){if(b&1)ans=ans*a%mod;a=a*a%mod;}return ans;}
ll gcd(ll a,ll b){return b>0?gcd(b,a%b):a;}
int n,m,T;
int a[maxn];
vector<pii> v[maxn];
vi base;
#define lson rt<<1
#define rson rt<<1|1
struct node{
    int tr[maxn<<2];
    int lz[maxn<<2];
    void pushdown(int rt){
        if(lz[rt]){
            lz[lson]+= lz[rt];
            lz[rson]+= lz[rt];
            tr[lson]+= lz[rt];
            tr[rson]+= lz[rt];
            lz[rt]=0;
        }
    }
    void update(int C,int L,int R,int l,int r,int rt){
        if(r<L||R<l) return;
        if(L<=l&&r<=R){
            tr[rt]+= C;
            lz[rt]+= C;
            return ;
        }
        pushdown(rt);
        int mid= l+r>>1;
        update(C, L, R, l, mid, lson);
        update(C, L, R, mid+1, r, rson);
        tr[rt]= max(tr[lson], tr[rson]);
    }
    int query(int L,int R,int l,int r,int rt){
        if(r<L||R<=l) return 0;
        if(L<=l&&r<=R){
            return tr[rt];
        }
        int mid= l+r>>1;
        pushdown(rt);
        return max(query(L,R,l,mid,lson),query(L,R,mid+1,r,rson));
    }
}t[2];
int dp[maxn][2];
int getId(int x){
    return lower_bound(all(base),x)-base.begin()+1;
}
struct Query{
    int l,r,t;
}q[maxn];
int main() {
    scanf("%d",&n);
    base.pb(0);
    for(int t,l,r,i=1;i<=n;i++){
        scanf("%d%d%d",&l,&r,&t);
        q[i]={l,r,t-1};
        base.pb(l);
        base.pb(r);
    }
    sort(all(base));
    base.erase(unique(all(base)),base.end());
    for(int i=1;i<=n;i++){
        q[i].l= getId(q[i].l);
        q[i].r= getId(q[i].r);
        v[q[i].r-1].pb({q[i].l, q[i].t});
    }
    int ans=0;
    for(int i=0; i<base.size(); i++){
        for(auto p: v[i]){
            t[p.se].update(1,1,p.fi-1,1,base.size(),1);
        }
        dp[i][0]= t[1].query(1,i+1,1,base.size(),1);
        dp[i][1]= t[0].query(1,i+1,1,base.size(),1);
        t[0].update(dp[i][0],i+1,i+1,1,base.size(),1);
        t[1].update(dp[i][1],i+1,i+1,1,base.size(),1);
        ans=max(ans, max(dp[i][0], dp[i][1]));
    }
    printf("%d\n",ans);
    //cin>>n>>m;
    return 0;
}
/*
7
19 20 1
13 15 2
6 11 2
4 10 1
14 17 1
13 13 2
5 9 1

*/


#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(register int i = a; i <= b; i++)
#define per(i, a, b) for(register int i = a; i >= b; i--)
typedef long long LL;
const LL mod = 1e9 + 7;
const int N = 3e5 + 5;

int n, t1[N], t2[N], ans, val[N], tot, cnt;
struct Seg {
	int l, r, op;
} a[N];
map <int, int> s;

bool cmp(Seg a, Seg b) {
	return a.r < b.r;
}

void update(int *t, int x, int k) {
	while(x <= cnt) {
		t[x] = max(t[x], k);
		x += x&-x;
	}
}

int query(int *t, int x) {
	int res = 0;
	while(x) {
		res = max(res, t[x]);
		x -= x&-x;
	}
	return res;
}

int main() {
	cin>>n;
	rep(i, 1, n) {
		scanf("%d%d%d", &a[i].l, &a[i].r, &a[i].op);
		val[++tot] = a[i].l,
		val[++tot] = a[i].r;
	}
	sort(a + 1, a + n + 1, cmp);
	sort(val + 1, val + tot + 1);

	rep(i, 1, tot)
	    if(!s[val[i]]) s[val[i]] = ++cnt;
	rep(i, 1, n) {
		int l = s[a[i].l], r = s[a[i].r], res = 0;
		if(a[i].op == 1) {
			res = max(query(t2, r), query(t1, l - 1)) + 1;
			update(t2, r, res);
		}
		else {
			res = max(query(t1, r), query(t2, l - 1)) + 1;
			update(t1, r, res);
		}
		ans = max(res, ans);
	}
	cout<<ans<<endl;
}


#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(register int i = a; i <= b; i++)
#define per(i, a, b) for(register int i = a; i >= b; i--)
typedef long long LL;
const LL mod = 1e9 + 7;
const int N = 3e5 + 5;

int n, ans;
struct Seg {
	int l, r, op;
} a[N];
set <int> s[2];

bool cmp(Seg a, Seg b) {
	if(a.r == b.r) return a.l < b.l;
	return a.r < b.r;
}

int main() {
	cin>>n;
	rep(i, 1, n)
	    cin>>a[i].l>>a[i].r>>a[i].op;
	sort(a + 1, a + n + 1, cmp);
	rep(i, 1, n) {
		int opt = a[i].op - 1;
		auto it = s[opt^1].lower_bound(a[i].l);
		if(it == s[opt^1].end())
			s[opt].insert(a[i].r);
		else {
			s[opt^1].erase(it);
			ans++;
		}
	}
	cout<<n - ans<<endl;
}


#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(register int i = a; i <= b; i++)
#define per(i, a, b) for(register int i = a; i >= b; i--)
typedef long long LL;
const LL mod = 1e9 + 7;
const int N = 3e5 + 5;

int n, ans;
struct Seg {
	int l, r, op;
} a[N];
multiset <int> s[2];

bool cmp(Seg a, Seg b) {
	return a.r == b.r ? a.l < b.l:a.r < b.r;
}

int main() {
	cin>>n;
	rep(i, 1, n)
	    cin>>a[i].l>>a[i].r>>a[i].op, a[i].op--;
	sort(a + 1, a + n + 1, cmp);
	rep(i, 1, n) {
		int opt = a[i].op;
		auto it = s[opt^1].lower_bound(a[i].l);
		if(it == s[opt^1].end())
			s[opt].insert(a[i].r);
		else {
			s[opt^1].erase(it);
			ans++;
		}
	}
	cout<<n - ans<<endl;
}


#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(register int i = a; i <= b; i++)
#define per(i, a, b) for(register int i = a; i >= b; i--)
typedef long long LL;
const LL mod = 1e9 + 7;
const int N = 3e5 + 5;

int n, ans;
struct Seg {
	int l, r, op;
} a[N];
set <int> s[2];

bool cmp(Seg a, Seg b) {
	if(a.r == b.r) return a.l < b.l;
	return a.r < b.r;
}

int main() {
	cin>>n;
	rep(i, 1, n)
	    cin>>a[i].l>>a[i].r>>a[i].op;
	sort(a + 1, a + n + 1, cmp);
	rep(i, 1, n) {
		int opt = a[i].op - 1;
		auto it = s[opt^1].lower_bound(a[i].l);
		if(it == s[opt^1].end())
			s[opt].insert(a[i].r);
		else {
			s[opt^1].erase(it);
			ans--;
		}
	}
	cout<<ans + n<<endl;
}


//Badwaper gg
#include<bits/stdc++.h>
#define inf 1e9
#define eps 1e-6
#define mp make_pair
#define pb push_back
#define re register ll
#define fr first
#define sd second
#define FOR(i,a,b) for(re i=a;i<=b;i++)
#define REP(i,a,b) for(re i=a;i>=b;i--)
#define lowbit(x) x&(-x)
#define Z(x) (x>=mod?x-mod:x)
#define N 500010
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline ll read()
{
	char ch=getchar();
	ll s=0,w=1;
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
	return s*w;
}
int n;
struct node{int l,r,t;}t[N];
int p[N],len,ans,c[N][2];
struct Segment
{
	int lazy[N<<2],maxn[N<<2];
	inline void pushup(int x){maxn[x]=max(maxn[ls],maxn[rs]);}
	inline void pushtag(int x,int v){maxn[x]+=v;lazy[x]+=v;}
	inline void pushdown(int x){if(lazy[x])pushtag(ls,lazy[x]),pushtag(rs,lazy[x]),lazy[x]=0;}
	void add(int l,int r,int x,int left,int right,int val)
	{
		if(l==left&&right==r){pushtag(x,val);return ;}
		pushdown(x);
		if(right<=mid)add(l,mid,ls,left,right,val);
		else if(left>mid)add(mid+1,r,rs,left,right,val);
		else add(l,mid,ls,left,mid,val),add(mid+1,r,rs,mid+1,right,val);
		pushup(x);
	}
	int que(int l,int r,int x,int left,int right)
	{
		if(left>right)return 0;
		if(l==left&&right==r)return maxn[x];
		pushdown(x);
		if(right<=mid)return que(l,mid,ls,left,right);
		else if(left>mid)return que(mid+1,r,rs,left,right);
		else return max(que(l,mid,ls,left,mid),que(mid+1,r,rs,mid+1,right));
	}
}T[2];
inline int cmp(node a,node b){return a.r<b.r||(a.r==b.r&&a.l>b.l);}
inline void add(int x,int t){for(;x<=len;x+=lowbit(x))c[x][t]++;}
inline int que(int x,int t){int s=0;for(;x;x-=lowbit(x))s+=c[x][t];return s;}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n=read();
	FOR(i,1,n)t[i].l=read(),t[i].r=read(),t[i].t=read()-1;
	FOR(i,1,n)p[++len]=t[i].l,p[++len]=t[i].r;
	sort(p+1,p+len+1);len=unique(p+1,p+len+1)-p-1;
	FOR(i,1,n)t[i].l=lower_bound(p+1,p+len+1,t[i].l)-p,t[i].r=lower_bound(p+1,p+len+1,t[i].r)-p;
	sort(t+1,t+n+1,cmp);
	FOR(i,1,n)
	{
		int p=t[i].t,f=T[p^1].que(0,len,1,0,t[i].l-1)+que(t[i].r,p)+1;
		add(t[i].l,p);T[p^1].add(0,len,1,t[i].l,len,-1);T[p].add(0,len,1,t[i].r,t[i].r,f);
		ans=max(ans,f);
//		cout<<"WTF:"<<t[i].l<<" "<<t[i].r<<" "<<p<<" "<<T[p^1].que(0,len,1,0,t[i].l-1)<<" "<<que(t[i].r,p)<<" "<<f<<endl;
	}
	printf("%d\n",ans);
	return 0;
}


//Badwaper gg
#include<bits/stdc++.h>
#define inf 1e9
#define eps 1e-6
#define mp make_pair
#define pb push_back
#define re register ll
#define fr first
#define sd second
#define FOR(i,a,b) for(re i=a;i<=b;i++)
#define REP(i,a,b) for(re i=a;i>=b;i--)
#define lowbit(x) x&(-x)
#define Z(x) (x>=mod?x-mod:x)
#define N 500010
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline ll read()
{
	char ch=getchar();
	ll s=0,w=1;
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
	return s*w;
}
int n;
struct node{int l,r,t;}t[N];
int p[N],len,ans,c[N][2],val[N][2];
struct Segment
{
	int lazy[N<<2],maxn[N<<2];
	inline void pushup(int x){maxn[x]=max(maxn[ls],maxn[rs]);}
	inline void pushtag(int x,int v){maxn[x]+=v;lazy[x]+=v;}
	inline void pushdown(int x){if(lazy[x])pushtag(ls,lazy[x]),pushtag(rs,lazy[x]),lazy[x]=0;}
	void add(int l,int r,int x,int left,int right,int val)
	{
		if(l==left&&right==r){pushtag(x,val);return ;}
		pushdown(x);
		if(right<=mid)add(l,mid,ls,left,right,val);
		else if(left>mid)add(mid+1,r,rs,left,right,val);
		else add(l,mid,ls,left,mid,val),add(mid+1,r,rs,mid+1,right,val);
		pushup(x);
	}
	int que(int l,int r,int x,int left,int right)
	{
		if(left>right)return 0;
		if(l==left&&right==r){return maxn[x];}
		pushdown(x);
		if(right<=mid)return que(l,mid,ls,left,right);
		else if(left>mid)return que(mid+1,r,rs,left,right);
		else return max(que(l,mid,ls,left,mid),que(mid+1,r,rs,mid+1,right));
	}
}T[2];
inline int cmp(node a,node b){return a.r<b.r||(a.r==b.r&&a.l>b.l);}
inline void add(int x,int t){for(;x<=len;x+=lowbit(x))c[x][t]++;}
inline int que(int x,int t){int s=0;for(;x;x-=lowbit(x))s+=c[x][t];return s;}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n=read();
	FOR(i,1,n)t[i].l=read(),t[i].r=read(),t[i].t=read()-1;
	FOR(i,1,n)p[++len]=t[i].l,p[++len]=t[i].r;
	sort(p+1,p+len+1);len=unique(p+1,p+len+1)-p-1;
	FOR(i,1,n)t[i].l=lower_bound(p+1,p+len+1,t[i].l)-p,t[i].r=lower_bound(p+1,p+len+1,t[i].r)-p;
	sort(t+1,t+n+1,cmp);
	FOR(i,1,n)
	{
		int p=t[i].t,f=T[p^1].que(0,len,1,0,t[i].l-1)+que(t[i].r,p)+1;
		add(t[i].l,p);T[p^1].add(0,len,1,t[i].l,len,-1);if(f>val[t[i].r][p])T[p].add(0,len,1,t[i].r,t[i].r,f-val[t[i].r][p]),val[t[i].r][p]=f;
		ans=max(ans,f);
	}
	printf("%d\n",ans);
	return 0;
}


#include <algorithm>　　　 //STL 通用算法
#include <bitset>　　　　　//STL 位集容器
#include <cctype>         //字符处理
#include <cerrno> 　　　　 //定义错误码
#include <cfloat>　　　　 //浮点数处理
#include <ciso646>         //对应各种运算符的宏
#include <climits> 　　　　//定义各种数据类型最值的常量
#include <clocale> 　　　　//定义本地化函数
#include <cmath> 　　　　　//定义数学函数
#include <complex>　　　　 //复数类
#include <csignal>         //信号机制支持
#include <csetjmp>         //异常处理支持
#include <cstdarg>         //不定参数列表支持
#include <cstddef>         //常用常量
#include <cstdio> 　　　　 //定义输入／输出函数
#include <cstdlib> 　　　　//定义杂项函数及内存分配函数
#include <cstring> 　　　　//字符串处理
#include <ctime> 　　　　　//定义关于时间的函数
#include <cwchar> 　　　　 //宽字符处理及输入／输出
#include <cwctype> 　　　　//宽字符分类
#include <deque>　　　　　 //STL 双端队列容器
#include <exception>　　　 //异常处理类
#include <fstream> 　　　 //文件输入／输出
#include <functional>　　　//STL 定义运算函数（代替运算符）
#include <limits> 　　　　 //定义各种数据类型最值常量
#include <list>　　　　　　//STL 线性列表容器
#include <locale>         //本地化特定信息
#include <map>　　　　　　 //STL 映射容器
#include <memory>         //STL通过分配器进行的内存分配
#include<new>            //动态内存分配
#include <numeric>         //STL常用的数字操作
#include <iomanip> 　　　 //参数化输入／输出
#include <ios>　　　　　　 //基本输入／输出支持
#include <iosfwd>　　　　　//输入／输出系统使用的前置声明
#include <iostream> 　　　//数据流输入／输出
#include <istream>　　　　 //基本输入流
#include <iterator>        //STL迭代器
#include <ostream>　　　　 //基本输出流
#include <queue>　　　　　 //STL 队列容器
#include <set>　　　　　　 //STL 集合容器
#include <sstream>　　　　 //基于字符串的流
#include <stack>　　　　　 //STL 堆栈容器
#include <stdexcept>　　　 //标准异常类
#include <streambuf>　　　 //底层输入／输出支持
#include <string>　　　　　//字符串类
#include <typeinfo>        //运行期间类型信息
#include <utility>　　　　 //STL 通用模板类
#include <valarray>        //对包含值的数组的操作
#include <vector>　　　　　//STL 动态数组容器
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;

const int MAXN=2e5+10;
const int MOD=998244353;
const int INF=0x3f3f3f3f;

inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
inline ll readll(){
	ll x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)) x=(x<<3ll)+(x<<1ll)+1ll*(c-'0'),c=getchar();
	return x*f;
}
int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}
ll gcd(ll x,ll y){
	return y?gcd(y,x%y):x;
}

int n,tmp[MAXN<<1],tot;
struct seg{
	int l,r,col;
	bool operator <(const seg& rhs)const{
		return (r<rhs.r);
	}
}a[MAXN];
struct sgt{
	int mx[MAXN<<3],tag[MAXN<<3];
	void pushdown(int o){
		if(tag[o]){
			tag[o<<1]+=tag[o];
			tag[o<<1|1]+=tag[o];
			mx[o<<1]+=tag[o];
			mx[o<<1|1]+=tag[o];
			tag[o]=0;
		}
	}
	void pushup(int o){mx[o]=max(mx[o<<1],mx[o<<1|1]);}
	void build(int o,int l,int r){
		mx[o]=tag[o]=0;
		if(l==r) return;
		int mid=(l+r)>>1;
		build(o<<1,l,mid);
		build(o<<1|1,mid+1,r);
	}
	void modify(int o,int l,int r,int ql,int qr,int v){
		if(ql<=l&&qr>=r){
			mx[o]+=v,tag[o]+=v;
			return;
		}
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) modify(o<<1,l,mid,ql,qr,v);
		else if(ql>mid) modify(o<<1|1,mid+1,r,ql,qr,v);
		else modify(o<<1,l,mid,ql,qr,v),modify(o<<1|1,mid+1,r,ql,qr,v);
		pushup(o);
	}
	void change(int o,int l,int r,int pos,int v){
		if(l==r){mx[o]=v,tag[o]=0;return;}
		pushdown(o);
		int mid=(l+r)>>1;
		if(pos<=mid) change(o<<1,l,mid,pos,v);
		else change(o<<1|1,mid+1,r,pos,v);
		pushup(o);
	}
	int query(int o,int l,int r,int ql,int qr){
		if(ql<=l&&qr>=r) return mx[o];
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) return query(o<<1,l,mid,ql,qr);
		else if(ql>mid) return query(o<<1|1,mid+1,r,ql,qr);
		else return max(query(o<<1,l,mid,ql,qr),query(o<<1|1,mid+1,r,ql,qr));
	}
}bl,wh;

int main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i].l=read(),a[i].r=read(),a[i].col=read();
		tmp[++tot]=a[i].l,tmp[++tot]=a[i].r;
	}

	sort(a+1,a+1+n);
	sort(tmp+1,tmp+1+tot);
	tot=unique(tmp+1,tmp+1+tot)-tmp-1;
	for(int i=1;i<=n;i++){
		a[i].l=lower_bound(tmp+1,tmp+1+tot,a[i].l)-tmp;
		a[i].r=lower_bound(tmp+1,tmp+1+tot,a[i].r)-tmp;
	}

	bl.build(1,0,tot);wh.build(1,0,tot);
	for(int i=1;i<=n;i++){
		if(a[i].col==1) wh.modify(1,0,tot,0,a[i].l-1,1);
		else bl.modify(1,0,tot,0,a[i].l-1,1);
		int mx1=0,mx2=0;

		if(a[i].col==1) mx1=wh.query(1,0,tot,0,a[i].l-1);
		else mx2=bl.query(1,0,tot,0,a[i].l-1);
		if(a[i].col==1&&mx1>bl.query(1,0,tot,a[i].r,a[i].r)) bl.change(1,0,tot,a[i].r,mx1);
		else if(a[i].col==2&&mx2>wh.query(1,0,tot,a[i].r,a[i].r))wh.change(1,0,tot,a[i].r,mx2);
	}
	printf("%d\n",max(wh.query(1,0,tot,0,tot),bl.query(1,0,tot,0,tot)));
	return 0;
}


#include <algorithm>　　　 //STL 通用算法
#include <bitset>　　　　　//STL 位集容器
#include <cctype>         //字符处理
#include <cerrno> 　　　　 //定义错误码
#include <cfloat>　　　　 //浮点数处理
#include <ciso646>         //对应各种运算符的宏
#include <climits> 　　　　//定义各种数据类型最值的常量
#include <clocale> 　　　　//定义本地化函数
#include <cmath> 　　　　　//定义数学函数
#include <complex>　　　　 //复数类
#include <csignal>         //信号机制支持
#include <csetjmp>         //异常处理支持
#include <cstdarg>         //不定参数列表支持
#include <cstddef>         //常用常量
#include <cstdio> 　　　　 //定义输入／输出函数
#include <cstdlib> 　　　　//定义杂项函数及内存分配函数
#include <cstring> 　　　　//字符串处理
#include <ctime> 　　　　　//定义关于时间的函数
#include <cwchar> 　　　　 //宽字符处理及输入／输出
#include <cwctype> 　　　　//宽字符分类
#include <deque>　　　　　 //STL 双端队列容器
#include <exception>　　　 //异常处理类
#include <fstream> 　　　 //文件输入／输出
#include <functional>　　　//STL 定义运算函数（代替运算符）
#include <limits> 　　　　 //定义各种数据类型最值常量
#include <list>　　　　　　//STL 线性列表容器
#include <locale>         //本地化特定信息
#include <map>　　　　　　 //STL 映射容器
#include <memory>         //STL通过分配器进行的内存分配
#include<new>            //动态内存分配
#include <numeric>         //STL常用的数字操作
#include <iomanip> 　　　 //参数化输入／输出
#include <ios>　　　　　　 //基本输入／输出支持
#include <iosfwd>　　　　　//输入／输出系统使用的前置声明
#include <iostream> 　　　//数据流输入／输出
#include <istream>　　　　 //基本输入流
#include <iterator>        //STL迭代器
#include <ostream>　　　　 //基本输出流
#include <queue>　　　　　 //STL 队列容器
#include <set>　　　　　　 //STL 集合容器
#include <sstream>　　　　 //基于字符串的流
#include <stack>　　　　　 //STL 堆栈容器
#include <stdexcept>　　　 //标准异常类
#include <streambuf>　　　 //底层输入／输出支持
#include <string>　　　　　//字符串类
#include <typeinfo>        //运行期间类型信息
#include <utility>　　　　 //STL 通用模板类
#include <valarray>        //对包含值的数组的操作
#include <vector>　　　　　//STL 动态数组容器
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;

const int MAXN=2e5+10;
const int MOD=998244353;
const int INF=0x3f3f3f3f;

inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
inline ll readll(){
	ll x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)) x=(x<<3ll)+(x<<1ll)+1ll*(c-'0'),c=getchar();
	return x*f;
}
int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}
ll gcd(ll x,ll y){
	return y?gcd(y,x%y):x;
}

int n,tmp[MAXN<<1],tot;
struct seg{
	int l,r,col;
	bool operator <(const seg& rhs)const{
		return (r<rhs.r);
	}
}a[MAXN];
struct sgt{
	int mx[MAXN<<3],tag[MAXN<<3];
	void pushdown(int o){
		if(tag[o]){
			tag[o<<1]+=tag[o];
			tag[o<<1|1]+=tag[o];
			mx[o<<1]+=tag[o];
			mx[o<<1|1]+=tag[o];
			tag[o]=0;
		}
	}
	void pushup(int o){mx[o]=max(mx[o<<1],mx[o<<1|1]);}
	void build(int o,int l,int r){
		mx[o]=tag[o]=0;
		if(l==r) return;
		int mid=(l+r)>>1;
		build(o<<1,l,mid);
		build(o<<1|1,mid+1,r);
	}
	void modify(int o,int l,int r,int ql,int qr,int v){
		if(ql<=l&&qr>=r){
			mx[o]+=v,tag[o]+=v;
			return;
		}
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) modify(o<<1,l,mid,ql,qr,v);
		else if(ql>mid) modify(o<<1|1,mid+1,r,ql,qr,v);
		else modify(o<<1,l,mid,ql,qr,v),modify(o<<1|1,mid+1,r,ql,qr,v);
		pushup(o);
	}
	void change(int o,int l,int r,int pos,int v){
		if(l==r){mx[o]=v,tag[o]=0;return;}
		pushdown(o);
		int mid=(l+r)>>1;
		if(pos<=mid) change(o<<1,l,mid,pos,v);
		else change(o<<1|1,mid+1,r,pos,v);
		pushup(o);
	}
	int query(int o,int l,int r,int ql,int qr){
		if(ql<=l&&qr>=r) return mx[o];
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) return query(o<<1,l,mid,ql,qr);
		else if(ql>mid) return query(o<<1|1,mid+1,r,ql,qr);
		else return max(query(o<<1,l,mid,ql,qr),query(o<<1|1,mid+1,r,ql,qr));
	}
}bl,wh;

int main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i].l=read(),a[i].r=read(),a[i].col=read();
		tmp[++tot]=a[i].l,tmp[++tot]=a[i].r;
	}

	sort(a+1,a+1+n);
	sort(tmp+1,tmp+1+tot);
	tot=unique(tmp+1,tmp+1+tot)-tmp-1;
	for(int i=1;i<=n;i++){
		a[i].l=lower_bound(tmp+1,tmp+1+tot,a[i].l)-tmp;
		a[i].r=lower_bound(tmp+1,tmp+1+tot,a[i].r)-tmp;
	}

	bl.build(1,0,tot);wh.build(1,0,tot);
	for(int i=1;i<=n;i++){
		if(a[i].col==1) wh.modify(1,0,tot,0,a[i].l-1,1);
		else bl.modify(1,0,tot,0,a[i].l-1,1);
		int mx1=0,mx2=0;

		if(a[i].col==1) mx1=wh.query(1,0,tot,0,a[i].l-1);
		else mx2=bl.query(1,0,tot,0,a[i].l-1);
		if(a[i].col==1) bl.change(1,0,tot,a[i].r,mx1);
		else wh.change(1,0,tot,a[i].r,mx2);
	}
	printf("%d\n",max(wh.query(1,0,tot,0,tot),bl.query(1,0,tot,0,tot)));
	return 0;
}


#include <algorithm>　　　 //STL 通用算法
#include <bitset>　　　　　//STL 位集容器
#include <cctype>         //字符处理
#include <cerrno> 　　　　 //定义错误码
#include <cfloat>　　　　 //浮点数处理
#include <ciso646>         //对应各种运算符的宏
#include <climits> 　　　　//定义各种数据类型最值的常量
#include <clocale> 　　　　//定义本地化函数
#include <cmath> 　　　　　//定义数学函数
#include <complex>　　　　 //复数类
#include <csignal>         //信号机制支持
#include <csetjmp>         //异常处理支持
#include <cstdarg>         //不定参数列表支持
#include <cstddef>         //常用常量
#include <cstdio> 　　　　 //定义输入／输出函数
#include <cstdlib> 　　　　//定义杂项函数及内存分配函数
#include <cstring> 　　　　//字符串处理
#include <ctime> 　　　　　//定义关于时间的函数
#include <cwchar> 　　　　 //宽字符处理及输入／输出
#include <cwctype> 　　　　//宽字符分类
#include <deque>　　　　　 //STL 双端队列容器
#include <exception>　　　 //异常处理类
#include <fstream> 　　　 //文件输入／输出
#include <functional>　　　//STL 定义运算函数（代替运算符）
#include <limits> 　　　　 //定义各种数据类型最值常量
#include <list>　　　　　　//STL 线性列表容器
#include <locale>         //本地化特定信息
#include <map>　　　　　　 //STL 映射容器
#include <memory>         //STL通过分配器进行的内存分配
#include<new>            //动态内存分配
#include <numeric>         //STL常用的数字操作
#include <iomanip> 　　　 //参数化输入／输出
#include <ios>　　　　　　 //基本输入／输出支持
#include <iosfwd>　　　　　//输入／输出系统使用的前置声明
#include <iostream> 　　　//数据流输入／输出
#include <istream>　　　　 //基本输入流
#include <iterator>        //STL迭代器
#include <ostream>　　　　 //基本输出流
#include <queue>　　　　　 //STL 队列容器
#include <set>　　　　　　 //STL 集合容器
#include <sstream>　　　　 //基于字符串的流
#include <stack>　　　　　 //STL 堆栈容器
#include <stdexcept>　　　 //标准异常类
#include <streambuf>　　　 //底层输入／输出支持
#include <string>　　　　　//字符串类
#include <typeinfo>        //运行期间类型信息
#include <utility>　　　　 //STL 通用模板类
#include <valarray>        //对包含值的数组的操作
#include <vector>　　　　　//STL 动态数组容器
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;

const int MAXN=2e5+10;
const int MOD=998244353;
const int INF=0x3f3f3f3f;

inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
inline ll readll(){
	ll x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)) x=(x<<3ll)+(x<<1ll)+1ll*(c-'0'),c=getchar();
	return x*f;
}
int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}
ll gcd(ll x,ll y){
	return y?gcd(y,x%y):x;
}

int n,tmp[MAXN<<1],tot;
struct seg{
	int l,r,col;
	bool operator <(const seg& rhs)const{
		return (r<rhs.r)||(r==rhs.r&&l>rhs.l);
	}
}a[MAXN];
struct sgt{
	int mx[MAXN<<3],tag[MAXN<<3];
	void pushdown(int o){
		if(tag[o]){
			tag[o<<1]+=tag[o];
			tag[o<<1|1]+=tag[o];
			mx[o<<1]+=tag[o];
			mx[o<<1|1]+=tag[o];
			tag[o]=0;
		}
	}
	void pushup(int o){mx[o]=max(mx[o<<1],mx[o<<1|1]);}
	void build(int o,int l,int r){
		mx[o]=tag[o]=0;
		if(l==r) return;
		int mid=(l+r)>>1;
		build(o<<1,l,mid);
		build(o<<1|1,mid+1,r);
	}
	void modify(int o,int l,int r,int ql,int qr,int v){
		if(ql<=l&&qr>=r){
			mx[o]+=v,tag[o]+=v;
			return;
		}
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) modify(o<<1,l,mid,ql,qr,v);
		else if(ql>mid) modify(o<<1|1,mid+1,r,ql,qr,v);
		else modify(o<<1,l,mid,ql,qr,v),modify(o<<1|1,mid+1,r,ql,qr,v);
		pushup(o);
	}
	void change(int o,int l,int r,int pos,int v){
		if(l==r){mx[o]=v,tag[o]=0;return;}
		pushdown(o);
		int mid=(l+r)>>1;
		if(pos<=mid) change(o<<1,l,mid,pos,v);
		else change(o<<1|1,mid+1,r,pos,v);
		pushup(o);
	}
	int query(int o,int l,int r,int ql,int qr){
		if(ql<=l&&qr>=r) return mx[o];
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) return query(o<<1,l,mid,ql,qr);
		else if(ql>mid) return query(o<<1|1,mid+1,r,ql,qr);
		else return max(query(o<<1,l,mid,ql,qr),query(o<<1|1,mid+1,r,ql,qr));
	}
}bl,wh;

int main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i].l=read(),a[i].r=read(),a[i].col=read();
		tmp[++tot]=a[i].l,tmp[++tot]=a[i].r;
	}

	sort(a+1,a+1+n);
	sort(tmp+1,tmp+1+tot);
	tot=unique(tmp+1,tmp+1+tot)-tmp-1;
	for(int i=1;i<=n;i++){
		a[i].l=lower_bound(tmp+1,tmp+1+tot,a[i].l)-tmp;
		a[i].r=lower_bound(tmp+1,tmp+1+tot,a[i].r)-tmp;
	}

	bl.build(1,0,tot);wh.build(1,0,tot);
	for(int i=1;i<=n;i++){
		if(a[i].col==1) wh.modify(1,0,tot,0,a[i].l-1,1);
		else bl.modify(1,0,tot,0,a[i].l-1,1);
		int mx1=0,mx2=0;

		if(a[i].col==1) mx1=wh.query(1,0,tot,0,a[i].l-1);
		else mx2=bl.query(1,0,tot,0,a[i].l-1);
		if(a[i].col==1&&mx1>bl.query(1,0,tot,a[i].r,a[i].r)) bl.change(1,0,tot,a[i].r,mx1);
		else if(a[i].col==2&&mx2>wh.query(1,0,tot,a[i].r,a[i].r))wh.change(1,0,tot,a[i].r,mx2);
	}
	printf("%d\n",max(wh.query(1,0,tot,0,tot),bl.query(1,0,tot,0,tot)));
	return 0;
}


#include <algorithm>　　　 //STL 通用算法
#include <bitset>　　　　　//STL 位集容器
#include <cctype>         //字符处理
#include <cerrno> 　　　　 //定义错误码
#include <cfloat>　　　　 //浮点数处理
#include <ciso646>         //对应各种运算符的宏
#include <climits> 　　　　//定义各种数据类型最值的常量
#include <clocale> 　　　　//定义本地化函数
#include <cmath> 　　　　　//定义数学函数
#include <complex>　　　　 //复数类
#include <csignal>         //信号机制支持
#include <csetjmp>         //异常处理支持
#include <cstdarg>         //不定参数列表支持
#include <cstddef>         //常用常量
#include <cstdio> 　　　　 //定义输入／输出函数
#include <cstdlib> 　　　　//定义杂项函数及内存分配函数
#include <cstring> 　　　　//字符串处理
#include <ctime> 　　　　　//定义关于时间的函数
#include <cwchar> 　　　　 //宽字符处理及输入／输出
#include <cwctype> 　　　　//宽字符分类
#include <deque>　　　　　 //STL 双端队列容器
#include <exception>　　　 //异常处理类
#include <fstream> 　　　 //文件输入／输出
#include <functional>　　　//STL 定义运算函数（代替运算符）
#include <limits> 　　　　 //定义各种数据类型最值常量
#include <list>　　　　　　//STL 线性列表容器
#include <locale>         //本地化特定信息
#include <map>　　　　　　 //STL 映射容器
#include <memory>         //STL通过分配器进行的内存分配
#include<new>            //动态内存分配
#include <numeric>         //STL常用的数字操作
#include <iomanip> 　　　 //参数化输入／输出
#include <ios>　　　　　　 //基本输入／输出支持
#include <iosfwd>　　　　　//输入／输出系统使用的前置声明
#include <iostream> 　　　//数据流输入／输出
#include <istream>　　　　 //基本输入流
#include <iterator>        //STL迭代器
#include <ostream>　　　　 //基本输出流
#include <queue>　　　　　 //STL 队列容器
#include <set>　　　　　　 //STL 集合容器
#include <sstream>　　　　 //基于字符串的流
#include <stack>　　　　　 //STL 堆栈容器
#include <stdexcept>　　　 //标准异常类
#include <streambuf>　　　 //底层输入／输出支持
#include <string>　　　　　//字符串类
#include <typeinfo>        //运行期间类型信息
#include <utility>　　　　 //STL 通用模板类
#include <valarray>        //对包含值的数组的操作
#include <vector>　　　　　//STL 动态数组容器
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;

const int MAXN=2e5+10;
const int MOD=998244353;
const int INF=0x3f3f3f3f;

inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
inline ll readll(){
	ll x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)) x=(x<<3ll)+(x<<1ll)+1ll*(c-'0'),c=getchar();
	return x*f;
}
int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}
ll gcd(ll x,ll y){
	return y?gcd(y,x%y):x;
}

int n,tmp[MAXN<<1],tot;
struct seg{
	int l,r,col;
	bool operator <(const seg& rhs)const{
		return (r<rhs.r)||(r==rhs.r&&l<rhs.l);
	}
}a[MAXN];
struct sgt{
	int mx[MAXN<<3],tag[MAXN<<3];
	void pushdown(int o){
		if(tag[o]){
			tag[o<<1]+=tag[o];
			tag[o<<1|1]+=tag[o];
			mx[o<<1]+=tag[o];
			mx[o<<1|1]+=tag[o];
			tag[o]=0;
		}
	}
	void pushup(int o){mx[o]=max(mx[o<<1],mx[o<<1|1]);}
	void build(int o,int l,int r){
		mx[o]=tag[o]=0;
		if(l==r) return;
		int mid=(l+r)>>1;
		build(o<<1,l,mid);
		build(o<<1|1,mid+1,r);
	}
	void modify(int o,int l,int r,int ql,int qr,int v){
		if(ql<=l&&qr>=r){
			mx[o]+=v,tag[o]+=v;
			return;
		}
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) modify(o<<1,l,mid,ql,qr,v);
		else if(ql>mid) modify(o<<1|1,mid+1,r,ql,qr,v);
		else modify(o<<1,l,mid,ql,qr,v),modify(o<<1|1,mid+1,r,ql,qr,v);
		pushup(o);
	}
	void change(int o,int l,int r,int pos,int v){
		if(l==r){mx[o]=v,tag[o]=0;return;}
		pushdown(o);
		int mid=(l+r)>>1;
		if(pos<=mid) change(o<<1,l,mid,pos,v);
		else change(o<<1|1,mid+1,r,pos,v);
		pushup(o);
	}
	int query(int o,int l,int r,int ql,int qr){
		if(ql<=l&&qr>=r) return mx[o];
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) return query(o<<1,l,mid,ql,qr);
		else if(ql>mid) return query(o<<1|1,mid+1,r,ql,qr);
		else return max(query(o<<1,l,mid,ql,qr),query(o<<1|1,mid+1,r,ql,qr));
	}
}bl,wh;

int main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i].l=read(),a[i].r=read(),a[i].col=read();
		tmp[++tot]=a[i].l,tmp[++tot]=a[i].r;
	}

	sort(a+1,a+1+n);
	sort(tmp+1,tmp+1+tot);
	tot=unique(tmp+1,tmp+1+tot)-tmp-1;
	for(int i=1;i<=n;i++){
		a[i].l=lower_bound(tmp+1,tmp+1+tot,a[i].l)-tmp;
		a[i].r=lower_bound(tmp+1,tmp+1+tot,a[i].r)-tmp;
	}

	bl.build(1,0,tot);wh.build(1,0,tot);
	for(int i=1;i<=n;i++){
		if(a[i].col==1) wh.modify(1,0,tot,0,a[i].l-1,1);
		else bl.modify(1,0,tot,0,a[i].l-1,1);
		int mx1=0,mx2=0;

		if(a[i].col==1) mx1=wh.query(1,0,tot,0,a[i].l-1);
		else mx2=bl.query(1,0,tot,0,a[i].l-1);
		if(a[i].col==1) bl.change(1,0,tot,a[i].r,mx1);
		else wh.change(1,0,tot,a[i].r,mx2);
	}
	printf("%d\n",max(wh.query(1,0,tot,0,tot),bl.query(1,0,tot,0,tot)));
	return 0;
}


#include <algorithm>　　　 //STL 通用算法
#include <bitset>　　　　　//STL 位集容器
#include <cctype>         //字符处理
#include <cerrno> 　　　　 //定义错误码
#include <cfloat>　　　　 //浮点数处理
#include <ciso646>         //对应各种运算符的宏
#include <climits> 　　　　//定义各种数据类型最值的常量
#include <clocale> 　　　　//定义本地化函数
#include <cmath> 　　　　　//定义数学函数
#include <complex>　　　　 //复数类
#include <csignal>         //信号机制支持
#include <csetjmp>         //异常处理支持
#include <cstdarg>         //不定参数列表支持
#include <cstddef>         //常用常量
#include <cstdio> 　　　　 //定义输入／输出函数
#include <cstdlib> 　　　　//定义杂项函数及内存分配函数
#include <cstring> 　　　　//字符串处理
#include <ctime> 　　　　　//定义关于时间的函数
#include <cwchar> 　　　　 //宽字符处理及输入／输出
#include <cwctype> 　　　　//宽字符分类
#include <deque>　　　　　 //STL 双端队列容器
#include <exception>　　　 //异常处理类
#include <fstream> 　　　 //文件输入／输出
#include <functional>　　　//STL 定义运算函数（代替运算符）
#include <limits> 　　　　 //定义各种数据类型最值常量
#include <list>　　　　　　//STL 线性列表容器
#include <locale>         //本地化特定信息
#include <map>　　　　　　 //STL 映射容器
#include <memory>         //STL通过分配器进行的内存分配
#include<new>            //动态内存分配
#include <numeric>         //STL常用的数字操作
#include <iomanip> 　　　 //参数化输入／输出
#include <ios>　　　　　　 //基本输入／输出支持
#include <iosfwd>　　　　　//输入／输出系统使用的前置声明
#include <iostream> 　　　//数据流输入／输出
#include <istream>　　　　 //基本输入流
#include <iterator>        //STL迭代器
#include <ostream>　　　　 //基本输出流
#include <queue>　　　　　 //STL 队列容器
#include <set>　　　　　　 //STL 集合容器
#include <sstream>　　　　 //基于字符串的流
#include <stack>　　　　　 //STL 堆栈容器
#include <stdexcept>　　　 //标准异常类
#include <streambuf>　　　 //底层输入／输出支持
#include <string>　　　　　//字符串类
#include <typeinfo>        //运行期间类型信息
#include <utility>　　　　 //STL 通用模板类
#include <valarray>        //对包含值的数组的操作
#include <vector>　　　　　//STL 动态数组容器
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;

const int MAXN=2e5+10;
const int MOD=998244353;
const int INF=0x3f3f3f3f;

inline int read(){
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c))x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
inline ll readll(){
	ll x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)) x=(x<<3ll)+(x<<1ll)+1ll*(c-'0'),c=getchar();
	return x*f;
}
int gcd(int x,int y){
	return y?gcd(y,x%y):x;
}
ll gcd(ll x,ll y){
	return y?gcd(y,x%y):x;
}

int n,tmp[MAXN<<1],tot;
struct seg{
	int l,r,col;
	bool operator <(const seg& rhs)const{
		return (r<rhs.r)||(r==rhs.r&&l>rhs.l);
	}
}a[MAXN];
struct sgt{
	int mx[MAXN<<3],tag[MAXN<<3];
	void pushdown(int o){
		if(tag[o]){
			tag[o<<1]+=tag[o];
			tag[o<<1|1]+=tag[o];
			mx[o<<1]+=tag[o];
			mx[o<<1|1]+=tag[o];
			tag[o]=0;
		}
	}
	void pushup(int o){mx[o]=max(mx[o<<1],mx[o<<1|1]);}
	void build(int o,int l,int r){
		mx[o]=tag[o]=0;
		if(l==r) return;
		int mid=(l+r)>>1;
		build(o<<1,l,mid);
		build(o<<1|1,mid+1,r);
	}
	void modify(int o,int l,int r,int ql,int qr,int v){
		if(ql<=l&&qr>=r){
			mx[o]+=v,tag[o]+=v;
			return;
		}
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) modify(o<<1,l,mid,ql,qr,v);
		else if(ql>mid) modify(o<<1|1,mid+1,r,ql,qr,v);
		else modify(o<<1,l,mid,ql,qr,v),modify(o<<1|1,mid+1,r,ql,qr,v);
		pushup(o);
	}
	void change(int o,int l,int r,int pos,int v){
		if(l==r){mx[o]=v,tag[o]=0;return;}
		pushdown(o);
		int mid=(l+r)>>1;
		if(pos<=mid) change(o<<1,l,mid,pos,v);
		else change(o<<1|1,mid+1,r,pos,v);
		pushup(o);
	}
	int query(int o,int l,int r,int ql,int qr){
		if(ql<=l&&qr>=r) return mx[o];
		pushdown(o);
		int mid=(l+r)>>1;
		if(qr<=mid) return query(o<<1,l,mid,ql,qr);
		else if(ql>mid) return query(o<<1|1,mid+1,r,ql,qr);
		else return max(query(o<<1,l,mid,ql,qr),query(o<<1|1,mid+1,r,ql,qr));
	}
}bl,wh;

int main(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i].l=read(),a[i].r=read(),a[i].col=read();
		tmp[++tot]=a[i].l,tmp[++tot]=a[i].r;
	}

	sort(a+1,a+1+n);
	sort(tmp+1,tmp+1+tot);
	tot=unique(tmp+1,tmp+1+tot)-tmp-1;
	for(int i=1;i<=n;i++){
		a[i].l=lower_bound(tmp+1,tmp+1+tot,a[i].l)-tmp;
		a[i].r=lower_bound(tmp+1,tmp+1+tot,a[i].r)-tmp;
	}

	bl.build(1,0,tot);wh.build(1,0,tot);
	for(int i=1;i<=n;i++){
		if(a[i].col==1) wh.modify(1,0,tot,0,a[i].l-1,1);
		else bl.modify(1,0,tot,0,a[i].l-1,1);
		int mx1=0,mx2=0;

		if(a[i].col==1) mx1=wh.query(1,0,tot,0,a[i].l-1);
		else mx2=bl.query(1,0,tot,0,a[i].l-1);
		if(a[i].col==1) bl.change(1,0,tot,a[i].r,mx1);
		else wh.change(1,0,tot,a[i].r,mx2);
	}
	printf("%d\n",max(wh.query(1,0,tot,0,tot),bl.query(1,0,tot,0,tot)));
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
int main() {
	long long T;
	cin >> T;
	long long n, s, t, otv;
	long long i = 1;
	while(i <= T){
		cin >> n >> s >> t;
		if( n == s && n == t)
		cout << 1 << endl;
		else
		cout << min(s, t) + 1 << endl;
		i++;
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
 long long mini(long long a, long long b){
 	if( a > b ) return b;
 	else return a;
 }
int main() {
	long long T;
	cin >> T;
	int n[10000], s[10000], t[10000];
	long long i = 1;
	while(i <= T){
		cin >> n[i] >> s[i] >> t[i];
		if( n[i] == s[i] && n[i] == t[i])
		cout << 1 << endl;
		else
		cout << mini(s[i], t[i]) + 1 << endl;
		i++;
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
 long long mini(long long a, long long b){
 	if( a > b ) return b;
 	else return a;
 }
int main() {
	long long T;
	cin >> T;
	long long n=0, s=0, t=0;
	long long i = 1;
	while(i <= T){
		cin >> n >> s >> t;
		if( n == s && n == t)
		cout << 1 << endl;
		else
		cout << mini(s, t) + 1 << endl;
		i++;
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
 long long mini(long long a, long long b){
 	if( a > b ) return b;
 	else return a;
 }
int main() {
	long long T;
	cin >> T;
	long long n, s, t, otv;
	long long i = 1;
	while(i <= T){
		cin >> n >> s >> t;
		if( n == s && n == t)
		cout << 1 << endl;
		else
		cout << mini(s, t) + 1 << endl;
		i++;
	}
	return 0;
}


#include <iostream>
using namespace std;
int main() {
	int T;
	cin >> T;
	int n, s, t, otv;
	int i = 1;
	while(i <= T){
		cin >> n >> s >> t;
		if( n == s && n == t)
		cout << 1 << endl;
		else
		cout << min(s, t) + 1 << endl;
		i++;
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
 long long mini(long long a, long long b){
 	if( a < b ) return b;
 	else return a;
 }
int main() {
	long long T;
	cin >> T;
	long long n=0, s=0, t=0;
	long long i = 1;
	while(i <= T){
		cin >> n >> s >> t;
		cout << mini(n-s, n-t) + 1 << endl;
		i++;
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
int main() {
	int T;
	cin >> T;
	int n, s, t, otv;
	int i = 1;
	while(i <= T){
		cin >> n >> s >> t;
		if( n == s && n == t)
		cout << 1 << endl;
		else
		cout << min(s, t) + 1 << endl;
		i++;
	}
	return 0;
}


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        if( n > s && n >t)
        cout<<min(s,t)+1<<endl;
        if(n==s && n==t)
        cout<<"1"<<endl;
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        if(n==s && n==t)
        cout<<"1"<<endl;
        else
        {
             s=min(s,t);
            if(s+1>=3 || n <=3)
            cout<<s+1<<endl;
            else
            cout<<"3"<<endl;
        }
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        if(n==s && n==t)
        cout<<"1"<<endl;
        else
        cout<<n/2+1<<endl;
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        int a[n];
        int f=n;
        int i=0;
        while(n!=0)
        {
         //   cout<<"p";
            if(s==t)
            {
               while(s+t > n)
               {
                   a[i]=2;
                //   cout<<i<<" ";
                   --s;
                   --t;
                   --n;
                   ++i;
               }
               for(int j=i;j<f;++j)
               {
                   if(s>0)
                   {
                       a[j]=0;
                   //    cout<<j<<" ";
                       --s;
                       --n;
                   }
                   else//t=1
                   {
                       a[j]=1;
                   //    cout<<j<<" ";
                       --t;
                       --n;
                   }
               }
            }
            else
            if(s > t)
            {
                while(s>t)
                {
                    a[i]=0;
                    --s;
                    ++i;
                    --n;
                }
            }
            else
            {
                 while(s<t)
                {
                    a[i]=1;
                    //cout<<i<<" ";
                    --t;
                    ++i;
                    --n;
                }
            }
        }
        ll m1=0,m2=0,m3;
        for(int i=0;i<f;++i)
        {
      //      cout<<a[i]<<" ";
           if(a[i]==1)
           ++m1;
           else
           if(a[i]==0)
           ++m2;
        }
        m3=max(m1,m2);
        if(m3 ==0)
        cout<<"1"<<endl;
        else
        cout<<m3+1<<endl;
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        int a[n];
        int f=n;
        int i=0,m1=0,m2=0,m3;
        while(n!=0)
        {
            if(s==t)
            {
               if(s+t > n)
               {
                  ll hj=s+t-n;
                  s-=hj;
                  t-=hj;
               }
               m1+=s;
               m2+=t;
               break;
            }
            else
            if(s > t)
            {
                  m2+=(s-t);
                  n-=(s-t);
                  s=t;

            }
            else
            {
                if(s<t)
                {
                    m1+=(t-s);
                    //t=s;
                    n-=(t-s);
                     t=s;
                }
            }
        }
   //     ll m1=0,m2=0,m3;
      /*  for(int i=0;i<f;++i)
        {
      //      cout<<a[i]<<" ";
           if(a[i]==1)
           ++m1;
           else
           if(a[i]==0)
           ++m2;
        }*/
        m3=max(m1,m2);
        if(m3 ==0)
        cout<<"1"<<endl;
        else
        cout<<m3+1<<endl;
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        int a[n];
        int f=n;
        int i=0,m1=0,m2=0,m3;
        while(n!=0)
        {
         //   cout<<"p";
            if(s==t)
            {
               while(s+t > n)
               {
                   --s;
                   --t;
                   --n;
             //      ++i;
               }
               m1+=s;
               m2+=t;
               break;
             /*  for(int j=i;j<f;++j)
               {
                   if(s>0)
                   {
                       a[j]=0;
                   //    cout<<j<<" ";
                       --s;
                       --n;
                   }
                   else//t=1
                   {
                       a[j]=1;
                   //    cout<<j<<" ";
                       --t;
                       --n;
                   }
               }*/
            }
            else
            if(s > t)
            {
                  m2+=(s-t);
                  n-=(s-t);
                  s=t;

            }
            else
            {
                if(s<t)
                {
                    m1+=(t-s);
                    //t=s;
                    n-=(t-s);
                     t=s;
                }
            }
        }
   //     ll m1=0,m2=0,m3;
      /*  for(int i=0;i<f;++i)
        {
      //      cout<<a[i]<<" ";
           if(a[i]==1)
           ++m1;
           else
           if(a[i]==0)
           ++m2;
        }*/
        m3=max(m1,m2);
        if(m3 ==0)
        cout<<"1"<<endl;
        else
        cout<<m3+1<<endl;
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        if( n > s && n >t)
        cout<<min(s,t)+1<<endl;
        else
        cout<<min(s,t)<<endl;
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        if( n > s && n >t)
        cout<<min(s,t)+1<<endl;
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        if( (n > s && n >t) || (n>=s && n>t)  || (n>=t && n>s))
        cout<<min(s,t)+1<<endl;
        if(n==s && n==t)
        cout<<"1"<<endl;
    }
          }


#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<set>
#include<iostream>
typedef long long int ll;
#define ios   ios_base::sync_with_stdio(false);  cin.tie(0);    cout.tie(0);
using namespace std;
int main() {
    ios;
    ll p;
    cin>>p;
    while(p--)
    {
        ll n,s,t;
        cin>>n>>s>>t;
        if(n==s && n==t)
        cout<<"1"<<endl;
        else
        cout<<min(s,t)+1<<endl;
    }
          }


#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
   int h,n,s,t;
   cin>>h;
   for(int i=0;i<h;i++){
    cin>>n>>s>>t;
    if(s<=n/2||t<=n/2)
    cout<<min(min(s,t)+1,n)<<endl;
    else if(s<n||t<n)cout<<n-(min(s,t))+1<<endl;
    else cout<<1<<endl;
   }

}


#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
   int h;
   ll n,s,t;
   cin>>h;
   for(int i=0;i<h;i++){
    cin>>n>>s>>t;
    if(s<=n/2||t<=n/2)
    cout<<min(min(s,t)+1,n)<<endl;
    else if(s<n||t<n)cout<<n-(min(s,t))+1<<endl;
    else cout<<1<<endl;
   }

}


#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
   int h,n,s,t;
   cin>>h;
   for(int i=0;i<h;i++){
    cin>>n>>s>>t;
    if(s<=n/2||t<=n/2)
    cout<<min(min(s,t)+1,n)<<endl;
    else cout<<1<<endl;
   }

}


#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
   int h;
   ll n,s,t;
   cin>>h;
   for(int i=0;i<h;i++){
    cin>>n>>s>>t;

     if(s>=n&&t>=n)cout<<1<<endl;
     //else if((s<n&&t>=n)||(t<n&&s>=n))cout<<min(s,t)+1<<endl;
     else {
         int x=n-min(s,t)+1;
         cout<<x<<endl;

     }

   }

}


#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
   int h;
   ll n,s,t;
   cin>>h;
   for(int i=0;i<h;i++){
    cin>>n>>s>>t;

     if(s>=n&&t>=n)cout<<1<<endl;
     else if((s<n&&t>=n)||(t<n&&s>=n))cout<<min(s,t)+1<<endl;
     else {
         int x=min(s,t)+1;
         cout<<x<<endl;

     }

   }

}


#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
   int h,n,s,t;
   cin>>h;
   for(int i=0;i<h;i++){
    cin>>n>>s>>t;
    if(s<n||t<n)
    cout<<min(min(s,t)+1,n)<<endl;
    else cout<<1<<endl;
   }

}


#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
   int h;
   ll n,s,t;
   cin>>h;
   for(int i=0;i<h;i++){
    cin>>n>>s>>t;

     if(s>=n&&t>=n)cout<<1<<endl;
     else if((s<n&&t>=n)||(t<n&&s>=n))cout<<min(s,t)+1<<endl;
     else {
         int x=n-min(s,t)+1;
         cout<<x<<endl;

     }

   }

}


/*
   ⠀⠀⠀⢀⣠⣤⣶⣶⣶⣶⣶⣦⣄⡀
 ⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄
⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀
⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀
⠀⣾⣿⣿⣿⣿⣿⣿⡿⠿⠟⠛⠹⣿⣿⣿⡿⣿⣻⣿⡇
⠀⠘⠿⡛⡿⠋⠁⠀⠀⠀⠀⠀⢀⣻⡿⣿⡿⢿⣿⣿⣷
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⠿⡿⡑⠟⣿⢟⢋
⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⢹⣁⣇⠆
⠀⠀⠀⢢⣄⣀⡠⠀⣤⣤⡤⣶⡤⠂⠀⠀⢻⣿⠉⢖⠄
⠀⠀⠀⠀⠺⢿⡹⠂⠉⠉⠙⠃⠀⠀⠀⠀⢸⣿⣆⠃⠁
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⢀⣿⣿⣧⣶⡇
⠀⠀⠀⠀⠀⠂⡄⠀⢠⣄⣂⡀⡀⠀⠀⣿⣿⣿⣿⠿⣷
⠀⠀⠀⠀⠀⠀⢿⣿⠭⠿⠛⡻⣿⣄⢰⣿⣿⣿⠛⠀⡇⢻⣿⣶⣤
⠀⠀⠀⠀⠀⠀⠈⢿⠲⢶⠟⠀⢿⣿⣶⣿⡿⠛⠀⠀⠀⢀⣿⣿⣿
⠀⠀⠀⠀⠀⠀⠀⠈⢷⣦⣦⣼⣿⣿⣿⠟⠁⠀⠀⢀⣴⠿⢻⣿⣿
⡄⠀⠀⠀⢀⠤⠂⠀⠌⠉⣿⣿⣯⠋⠁⠀⠀⣠⣶⢿⡹⠃⣸⣿⣿
⣿⣀⣴⣾⠏⠀⠀⠀⣠⣴⠿⡏⠁⡄⠤⢶⠋⠋⡀⠀⣠⣾⠟⠙⠻
⣿⣿⣿⡟⠀⠀⠀⠊⠋⠉⠂⠁⠀⠀⠀⠀⠓⠮⡣⠿⠛.
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector <vll> vvll;
typedef pair <ll, ll> pll;
typedef vector <pll> vpll;
typedef vector<bool> vb;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define len(a) a.size()
#define newl '\n'
#define gcd __gcd
#define forl(i,k,n) for(ll i=k;i<n;i++)
#define fore(i,k,n) for(ll i=k;i<=n;i++)
#define revg(i,k,n) for(ll i=k;i>n;i--)
#define reve(i,k,n) for(ll i=k;i>=n;i--)
#define MOD 1000000007 //10^9 + 7
#define all(x) x.begin(),x.end()
#define len(a) a.size()
#define flush fflush(stdout)
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);

ll INF = 1000000000000000005LL;

// C++ template to print container elements
template <typename T, typename S>
ostream& operator<<(ostream& os, const pair<T, S>& v) {
    os << '('<< v.first <<' '<< v.second<<')';
    return os;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const map<T, S>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const unordered_map<T, S>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}

//templated functions to print vector and for doing something like this print(a,b,c...)
template<typename T>
void print(T var1)
{   cout<<var1<<'\n';}
template<typename T,typename... Types>
void print(T var1,Types...var2)
{   cout<<var1<<' ';print(var2...); }

template<typename T>
void read(T &x)
{   cin>>x;}
template<typename T,typename...Types>
void read(T &var1,Types&... var2)
{   cin>>var1;read(var2...);}
template<typename T>
void read(vector<T> &var1)
{   for(auto &i:var1)read(i);}

template<typename T>
T Max(T x)
{   return x; }
template<typename T,typename... Types>
T Max(T var1,Types...var2)
{   return var1>=Max(var2...)?var1:Max(var2...); }
template<typename T>
T Min(T x)
{   return x; }
template<typename T,typename... Types>
T Min(T var1,Types...var2)
{   return var1<=Min(var2...)?var1:Min(var2...); }

ll N = 1e5, LOGN = 25;

void solve() {
    ll n,s,t;
    read(n,s,t);
    if (s+t == 2*n)print(1);
    else if (s+t == n) print(Min(s,t) + 1);
    else{
        print(Min(s,t) + 1);
    }
}

int main()
{
    fastio;
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("error.txt", "w", stderr);
    freopen("output.txt", "w", stdout);
#endif

    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    cerr << "time taken : " << (float)clock() / CLOCKS_PER_SEC << " secs" << endl;
    return 0;
}


/*
   ⠀⠀⠀⢀⣠⣤⣶⣶⣶⣶⣶⣦⣄⡀
 ⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄
⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀
⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀
⠀⣾⣿⣿⣿⣿⣿⣿⡿⠿⠟⠛⠹⣿⣿⣿⡿⣿⣻⣿⡇
⠀⠘⠿⡛⡿⠋⠁⠀⠀⠀⠀⠀⢀⣻⡿⣿⡿⢿⣿⣿⣷
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⠿⡿⡑⠟⣿⢟⢋
⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⢹⣁⣇⠆
⠀⠀⠀⢢⣄⣀⡠⠀⣤⣤⡤⣶⡤⠂⠀⠀⢻⣿⠉⢖⠄
⠀⠀⠀⠀⠺⢿⡹⠂⠉⠉⠙⠃⠀⠀⠀⠀⢸⣿⣆⠃⠁
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⢀⣿⣿⣧⣶⡇
⠀⠀⠀⠀⠀⠂⡄⠀⢠⣄⣂⡀⡀⠀⠀⣿⣿⣿⣿⠿⣷
⠀⠀⠀⠀⠀⠀⢿⣿⠭⠿⠛⡻⣿⣄⢰⣿⣿⣿⠛⠀⡇⢻⣿⣶⣤
⠀⠀⠀⠀⠀⠀⠈⢿⠲⢶⠟⠀⢿⣿⣶⣿⡿⠛⠀⠀⠀⢀⣿⣿⣿
⠀⠀⠀⠀⠀⠀⠀⠈⢷⣦⣦⣼⣿⣿⣿⠟⠁⠀⠀⢀⣴⠿⢻⣿⣿
⡄⠀⠀⠀⢀⠤⠂⠀⠌⠉⣿⣿⣯⠋⠁⠀⠀⣠⣶⢿⡹⠃⣸⣿⣿
⣿⣀⣴⣾⠏⠀⠀⠀⣠⣴⠿⡏⠁⡄⠤⢶⠋⠋⡀⠀⣠⣾⠟⠙⠻
⣿⣿⣿⡟⠀⠀⠀⠊⠋⠉⠂⠁⠀⠀⠀⠀⠓⠮⡣⠿⠛.
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector <vll> vvll;
typedef pair <ll, ll> pll;
typedef vector <pll> vpll;
typedef vector<bool> vb;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define len(a) a.size()
#define newl '\n'
#define gcd __gcd
#define forl(i,k,n) for(ll i=k;i<n;i++)
#define fore(i,k,n) for(ll i=k;i<=n;i++)
#define revg(i,k,n) for(ll i=k;i>n;i--)
#define reve(i,k,n) for(ll i=k;i>=n;i--)
#define MOD 1000000007 //10^9 + 7
#define all(x) x.begin(),x.end()
#define len(a) a.size()
#define flush fflush(stdout)
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);

ll INF = 1000000000000000005LL;

// C++ template to print container elements
template <typename T, typename S>
ostream& operator<<(ostream& os, const pair<T, S>& v) {
    os << '('<< v.first <<' '<< v.second<<')';
    return os;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const map<T, S>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const unordered_map<T, S>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}

//templated functions to print vector and for doing something like this print(a,b,c...)
template<typename T>
void print(T var1)
{   cout<<var1<<'\n';}
template<typename T,typename... Types>
void print(T var1,Types...var2)
{   cout<<var1<<' ';print(var2...); }

template<typename T>
void read(T &x)
{   cin>>x;}
template<typename T,typename...Types>
void read(T &var1,Types&... var2)
{   cin>>var1;read(var2...);}
template<typename T>
void read(vector<T> &var1)
{   for(auto &i:var1)read(i);}

template<typename T>
T Max(T x)
{   return x; }
template<typename T,typename... Types>
T Max(T var1,Types...var2)
{   return var1>=Max(var2...)?var1:Max(var2...); }
template<typename T>
T Min(T x)
{   return x; }
template<typename T,typename... Types>
T Min(T var1,Types...var2)
{   return var1<=Min(var2...)?var1:Min(var2...); }

ll N = 1e5, LOGN = 25;

void solve() {
    ll n,s,t;
    read(n,s,t);
    print(Max(n-t,n-s) + 1);
}

int main()
{
    fastio;
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("error.txt", "w", stderr);
    freopen("output.txt", "w", stdout);
#endif

    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    cerr << "time taken : " << (float)clock() / CLOCKS_PER_SEC << " secs" << endl;
    return 0;
}


/*
   ⠀⠀⠀⢀⣠⣤⣶⣶⣶⣶⣶⣦⣄⡀
 ⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄
⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀
⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀
⠀⣾⣿⣿⣿⣿⣿⣿⡿⠿⠟⠛⠹⣿⣿⣿⡿⣿⣻⣿⡇
⠀⠘⠿⡛⡿⠋⠁⠀⠀⠀⠀⠀⢀⣻⡿⣿⡿⢿⣿⣿⣷
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⠿⡿⡑⠟⣿⢟⢋
⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⢹⣁⣇⠆
⠀⠀⠀⢢⣄⣀⡠⠀⣤⣤⡤⣶⡤⠂⠀⠀⢻⣿⠉⢖⠄
⠀⠀⠀⠀⠺⢿⡹⠂⠉⠉⠙⠃⠀⠀⠀⠀⢸⣿⣆⠃⠁
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⢀⣿⣿⣧⣶⡇
⠀⠀⠀⠀⠀⠂⡄⠀⢠⣄⣂⡀⡀⠀⠀⣿⣿⣿⣿⠿⣷
⠀⠀⠀⠀⠀⠀⢿⣿⠭⠿⠛⡻⣿⣄⢰⣿⣿⣿⠛⠀⡇⢻⣿⣶⣤
⠀⠀⠀⠀⠀⠀⠈⢿⠲⢶⠟⠀⢿⣿⣶⣿⡿⠛⠀⠀⠀⢀⣿⣿⣿
⠀⠀⠀⠀⠀⠀⠀⠈⢷⣦⣦⣼⣿⣿⣿⠟⠁⠀⠀⢀⣴⠿⢻⣿⣿
⡄⠀⠀⠀⢀⠤⠂⠀⠌⠉⣿⣿⣯⠋⠁⠀⠀⣠⣶⢿⡹⠃⣸⣿⣿
⣿⣀⣴⣾⠏⠀⠀⠀⣠⣴⠿⡏⠁⡄⠤⢶⠋⠋⡀⠀⣠⣾⠟⠙⠻
⣿⣿⣿⡟⠀⠀⠀⠊⠋⠉⠂⠁⠀⠀⠀⠀⠓⠮⡣⠿⠛.
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector <vll> vvll;
typedef pair <ll, ll> pll;
typedef vector <pll> vpll;
typedef vector<bool> vb;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define len(a) a.size()
#define newl '\n'
#define gcd __gcd
#define forl(i,k,n) for(ll i=k;i<n;i++)
#define fore(i,k,n) for(ll i=k;i<=n;i++)
#define revg(i,k,n) for(ll i=k;i>n;i--)
#define reve(i,k,n) for(ll i=k;i>=n;i--)
#define MOD 1000000007 //10^9 + 7
#define all(x) x.begin(),x.end()
#define len(a) a.size()
#define flush fflush(stdout)
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);

ll INF = 1000000000000000005LL;

// C++ template to print container elements
template <typename T, typename S>
ostream& operator<<(ostream& os, const pair<T, S>& v) {
    os << '('<< v.first <<' '<< v.second<<')';
    return os;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const map<T, S>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const unordered_map<T, S>& v) {
    int cnt=0;
    for (auto it : v)
    {    cnt != v.size()-1? os << it << ' ':os << it; cnt++;}
    return os;
}

//templated functions to print vector and for doing something like this print(a,b,c...)
template<typename T>
void print(T var1)
{   cout<<var1<<'\n';}
template<typename T,typename... Types>
void print(T var1,Types...var2)
{   cout<<var1<<' ';print(var2...); }

template<typename T>
void read(T &x)
{   cin>>x;}
template<typename T,typename...Types>
void read(T &var1,Types&... var2)
{   cin>>var1;read(var2...);}
template<typename T>
void read(vector<T> &var1)
{   for(auto &i:var1)read(i);}

template<typename T>
T Max(T x)
{   return x; }
template<typename T,typename... Types>
T Max(T var1,Types...var2)
{   return var1>=Max(var2...)?var1:Max(var2...); }
template<typename T>
T Min(T x)
{   return x; }
template<typename T,typename... Types>
T Min(T var1,Types...var2)
{   return var1<=Min(var2...)?var1:Min(var2...); }

ll N = 1e5, LOGN = 25;

void solve() {
    ll n,s,t;
    read(n,s,t);
    ll diff = abs(s-t);
    if(diff == 0 & s+t+2*diff == 2*n){
        cout<<1<<'\n';
        return;
    }
    s -= diff;
    t -= diff;
    ll ans = max(s,t) + 1;
    print(ans);
}

int main()
{
    fastio;
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("error.txt", "w", stderr);
    freopen("output.txt", "w", stdout);
#endif

    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    cerr << "time taken : " << (float)clock() / CLOCKS_PER_SEC << " secs" << endl;
    return 0;
}