#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<cassert>
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define ls (u<<1)
#define rs (u<<1|1)
#define mid ((l+r)/2)
using namespace std;
const int N = 400010;
int k[N], ans;
queue<int> q;
class TREE{
vector<int> t[N<<2];
void update(int u){
for(auto i = t[u].begin(); i != t[u].end(); ){
if(!k[*i]) i = t[u].erase(i);
else if(!--k[*i]) q.push(*i), i = t[u].erase(i);
else i++;
}
}
public:
void upd(int u, int l, int r, int x, int y, int id){
if(x <= l && r <= y) return t[u].push_back(id);
if(x <= mid) upd(ls, l, mid, x, y, id);
if(y > mid) upd(rs, mid + 1, r, x, y, id);
}
void del(int u, int l, int r, int x){
update(u);
if(l == r) return;
if(x <= mid) del(ls, l, mid, x);
else del(rs, mid + 1, r, x);
}
} tr;
int n, z[N];
void del(int x){
z[x]++;
tr.del(1, 1, n, x);
}
int B, l[N], r[N];
void update(bool flg = 0){
rep(i, 1, n) z[i] += z[i-1];
rep(i, 1, n) if(flg || k[i] > B){
k[i] -= (z[r[i]] - z[l[i] - 1]);
if(k[i] <= B) tr.upd(1, 1, n, l[i], r[i], i);
}
rep(i, 1, n) z[i] = 0;
}
int main(){
scanf("%d", &n); B = sqrt(n);
rep(i, 1, n){
scanf("%d%d%d", &l[i], &r[i], &k[i]);
k[i] = k[i];
if(!k[i]) q.push(i);
}
update(1);
int tmp = 0;
while(!q.empty()){
tmp++, ans++; int x = q.front(); q.pop();
del(x);
if(tmp == B) tmp = 0, update();
}
printf("%d\n", ans);
return 0;
}