//Accepted 804 KB 40 ms //整个题,都是坑 //1.The first line of each data set contains exactly one integer n, //1 <= n <= 8000, equal to the number of colored segments //意思是:n表示染色线段的条数,而不是区间的总长度 //2.x1 and x2 indicate the left endpoint and right endpoint of the segment, c indicates the color of the segment. //x1 ,x2 表示染色区间的端点位置,而染色的是区间 #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm> using namespace std; /** * This is a documentation comment block * 如果有一天你坚持不下去了,就想想你为什么走到这儿! * @authr songt */ ; int color[imax_n]; struct node { int l,r; int c; int change; }f[imax_n*]; void build(int t,int l,int r) { f[t].l=l; f[t].r=r; f[t].c=; f[t].change=; if (l==r) { return ; } ; build(*t,l,mid); build(*t+,mid+,r); } void update(int t,int l,int r,int c) { if (f[t].l==l && f[t].r==r) { f[t].c=c; f[t].change=; return ; } ) { f[*t].c=f[t].c; f[*t+].c=f[t].c; f[*t].change=f[*t+].change=; f[t].change=; } ; *t,l,r,c); else { *t+,l,r,c); else { update(*t,l,mid,c); update(*t+,mid+,r,c); } } } int query(int t,int k) { ; if (f[t].l==f[t].r && f[t].l==k) { return f[t].c; } ) { return f[t].c; } ; *t,k); *t+,k); } int n; int x,y,c; void slove() { build(,,); ;i<=n;i++) { scanf("%d%d%d",&x,&y,&c); x++; c++; if (x>y) continue ; update(,x,y,c); } int t1,t2; t1=; memset(color,,sizeof(color)); ;i<=;i++) { t2=query(,i); ) { t1=t2; continue ; } if (t2==t1) continue; color[t2]++; t1=t2; } ;i<=;i++) ) { printf(,color[i]); } } int main() { while (scanf("%d",&n)!=EOF) { slove(); printf("\n"); } ; }