http://poj.org/problem?id=2777 #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define N 100001 struct node { int l,r; int type; int getmid(){ return (l+r)>>1; } }p[4*N]; bool h[N]; void build(int l,int r,int id) { p[id].l=l; p[id].r=r; p[id].type=1; if(l==r) return; int mid=(l+r)>>1; build(l,mid,id<<1); build(mid+1,r,id<<1|1); } void update(int l,int r,int type,int id) { if(p[id].l==l&&p[id].r==r) { p[id].type=type; return; } if(p[id].type==type) return; if(p[id].type>0) { p[id<<1].type=p[id<<1|1].type=p[id].type; p[id].type=0; } int mid=p[id].getmid(); if(r<=mid) update(l,r,type,id<<1); else if(l>mid) update(l,r,type,id<<1|1); else { update(l,mid,type,id<<1); update(mid+1,r,type,id<<1|1); } } void query(int l,int r,int id) { if(p[id].type>0) { h[p[id].type]=1; return; } int mid=p[id].getmid(); if(r<=mid) query(l,r,id<<1); else if(l>mid) query(l,r,id<<1|1); else { query(l,mid,id<<1); query(mid+1,r,id<<1|1); } } int main(void) { int n,T,Q; while(~scanf("%d%d%d",&n,&T,&Q)) { build(1,n,1); while(Q--) { char ch[5]; scanf("%s",ch); if(ch[0]=='C') { int x,y,type; scanf("%d%d%d",&x,&y,&type); update(x,y,type,1); } else { memset(h,0,sizeof(h)); int x,y; scanf("%d%d",&x,&y); query(x,y,1); int ans=0; for(int i=1;i<=T;i++) if(h[i]) ans++; printf("%d/n",ans); } } } return 0; } lazy操作