2011-05-17 18:47:04 #include<stdio.h> #define N 16010 struct Node { int l, r, color; Node *ls, *rs; }node[N]; int resCol[8001],xx,col; Node* Build(int l,int r) { static int count=0; int mid=(l+r)>>1; Node* root=node+(count++); root->l=l; root->r=r; root->ls=root->rs=NULL; if(l<mid) { if(l+1<mid) root->ls=Build(l,mid); else { root->ls=node+(count++); root->ls->l=l; root->ls->r=mid;} } if(mid<r) { if(mid+1<r) root->rs=Build(mid,r); else { root->rs=node+(count++); root->rs->l=mid; root->rs->r=r;} } return root; } void init(Node* root) { if(root->ls!=NULL) init(root->ls); if(root->rs!=NULL) init(root->rs); root->color=-1; } void Update(Node *root,int x1,int x2,int color) { if(root->l>=x1&&root->r<=x2) { root->color=color; //cout<<root->l<<" root "<<root->r<<endl; } else { int mid=(root->l+root->r)>>1; //cout<<"else"<<endl; if(root->color>=0) { root->ls->color=root->rs->color=root->color; root->color=-1;} if(mid>x1) Update(root->ls,x1,x2,color); if(x2>mid) Update(root->rs,x1,x2,color); } } void getRes(Node *root) { if(root->color>=0) { if(xx!=root->l||(root->l==xx&&root->color!=col)) resCol[root->color]++; xx=root->r; col=root->color; // cout<<root->l<<"-"<<root->r<<"-"<<root->color<<endl; } else { if(root->ls!=NULL) getRes(root->ls); if(root->rs!=NULL) getRes(root->rs); } } int main() { int x1,x2,n,color,i; Node *root=Build(0,8000); while (~scanf("%d",&n)) { init(root); while (n--) { scanf("%d%d%d",&x1,&x2,&color); //cout<<x1<<" "<<x2<<endl; Update(root,x1,x2,color); } for(i=0;i<8001;i++) resCol[i]=0; col=-1; xx=-1; getRes(root); for(i=0;i<8001;i++) if(resCol[i]) printf("%d %d/n",i,resCol[i]); printf("/n"); } return 0; }