Time Limit: 1000MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
[Submit] [Go Back] [Status]
Description
Input
Output
Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define MAXN 100005 struct node { int l; int r; int color; }t[MAXN*3]; bool r[50]; void make(int st,int ed,int i) { t[i].l=st; t[i].r=ed; t[i].color=1; if(st==ed) { return ; } int mid=(t[i].l+t[i].r)/2; make(st,mid,i*2); make(mid+1,ed,i*2+1); } void updata(int st,int ed,int i,int c) { if(st==t[i].l&&ed==t[i].r) { t[i].color=c; return ; } if(t[i].color>0) { t[i*2+1].color=t[i*2].color=t[i].color; t[i].color=0; } int mid=(t[i].l+t[i].r)/2; if(st>mid) updata(st,ed,i*2+1,c); else if(ed<=mid) updata(st,ed,i*2,c); else { updata(st,mid,i*2,c); updata(mid+1,ed,i*2+1,c); } } void query(int st,int ed,int i) { if(t[i].color>0) { r[t[i].color]=1; return ; } int mid=(t[i].l+t[i].r)/2; if(st>mid) query(st,ed,i*2+1); else if(ed<=mid) query(st,ed,i*2); else { query(st,mid,i*2); query(mid+1,ed,i*2+1); } } int main() { int L,T,Q; char ch[2]; int count; int start,end ,c; scanf("%d%d%d",&L,&T,&Q); make(1,L,1); while(Q--) { scanf("%s",ch); if(strcmp(ch,"C")==0) { scanf("%d%d%d",&start,&end,&c); updata(start,end,1,c); } if(strcmp(ch,"P")==0) { count=0; memset(r,0,sizeof(r)); scanf("%d%d",&start,&end); query(start,end,1); for(int i=1;i<=30;i++) if(r[i]==1) count++; printf("%d\n",count); } } return 0; }