#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]; int 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, int val) { for (; i<=n; i += LSB(i)) { aib[i] ^= val; } } 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]); } set_arb (1,1,n); memset (aib,0,sizeof(aib)); for (int i=1; i<=m; ++i) { l = x[i]; r = y[i]; wh=0; int val = (query(y[i]) ^ query(x[i]-1)); if ((val^v[i]) != 0) { int upd = val^v[i]; query_arb(1,1,n); update (wh,upd); fina[wh] ^= upd; } update_arb (1,1,n); } for (int i=1; i<=n; ++i) { cout<