#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define vint vector::iterator #define vintp vector >::iterator #define inf 1000000 #define ll long long #define maxn 100010 #define mod 1000000007 using namespace std; ifstream fin ("A.in"); ofstream fout("A.out"); int n,l,r,wh,m,maxv; int x[100001],y[100001],v[100001],fina[100001]; int arb[400001],aib[400001]; int LSB (int i) { return i&-i; } int query (int i) { int s = 0; for (; i>0; i-= LSB(i)) { s += aib[i]; } return s; } void update (int i) { for (; i<=n; i += LSB(i)) { aib[i]++; } } void set_arb (int node, int left, int right) { if (left == right) { arb[node] = left; return; } int mid = (left + right)/2; set_arb (node*2,left,mid); set_arb(node*2+1,mid+1,right); arb[node] = arb[node*2]; } void update_arb (int node, int left, int right) { if (l <= left && right <= r) { arb[node] = 0; return; } int mid = (left+right)/2; if (l <= mid && arb[node*2]) update_arb (node*2,left,mid); if (r > mid && arb[node*2+1]) update_arb (node*2+1,mid+1,right); arb[node] = max (arb[node*2],arb[node*2+1]); } void query_arb (int node, int left, int right) { if (l <= left && right <= r) { wh = arb[node]; return; } int mid = (left + right)/2; if (l <= mid && arb[node*2]) query_arb (node*2,left,mid); if (r > mid && arb[node*2+1]) query_arb (node*2+1,mid+1,right); } int main () { cin>>n>>m; for (int i=1; i<=m; ++i) { cin>>x[i]>>y[i]>>v[i]; maxv = log2(v[i]); } for (int j=0; j<=maxv; ++j) { set_arb (1,1,n); memset (aib,0,sizeof(aib)); for (int i=1; i<=m; ++i) { int val = ((v[i]>>j)&1); l = x[i]; r = y[i]; wh=0; if ((query(y[i]) - query(x[i]-1))%2 != val) { query_arb(1,1,n); if (wh !=0 ) update (wh); fina[wh] += (1<