http://poj.org/problem?id=2777
注意:a可能比b大
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 1000010 5 using namespace std; 6 7 int T,L,O,a,b,c; 8 char ch; 9 struct node 10 { 11 int l,r,co; 12 }tree[3*maxn]; 13 bool tab[31]; 14 15 void build(int l,int r,int i) 16 { 17 tree[i].co=1; 18 tree[i].l=l;tree[i].r=r; 19 if(l<r) 20 { 21 int mid=(l+r)/2; 22 build(l,mid,i+i); 23 build(mid+1,r,i+i+1); 24 } 25 } 26 27 void update(int i) 28 { 29 if(tree[i].co>0) 30 { 31 tree[i+i].co=tree[i+i+1].co=tree[i].co; 32 } 33 tree[i].co=-1; 34 } 35 36 void insert1(int i,int l,int r,int co) 37 { 38 if(tree[i].l>=l&&tree[i].r<=r) 39 { 40 tree[i].co=co; 41 return ; 42 } 43 if(tree[i].l>r||tree[i].r<l) return ; 44 if(tree[i].l<tree[i].r) 45 { 46 int mid=(tree[i].l+tree[i].r)/2; 47 update(i); 48 if(r<=mid) insert1(i+i,l,r,co); 49 else if(l>mid) insert1(i+i+1,l,r,co); 50 else 51 { 52 insert1(i+i,l,mid,co); 53 insert1(i+i+1,mid+1,r,co); 54 } 55 } 56 } 57 58 void serch(int l,int r,int i) 59 { 60 if(tree[i].co>0) 61 { 62 tab[tree[i].co]=true; 63 return ; 64 } 65 if(tree[i].l<tree[i].r) 66 { 67 int mid=(tree[i].l+tree[i].r)/2; 68 if(r<=mid) serch(l,r,i+i); 69 else if(l>mid) serch(l,r,i+i+1); 70 else 71 { 72 serch(l,mid,i+i); 73 serch(mid+1,r,i+i+1); 74 } 75 } 76 } 77 int main() 78 { 79 scanf("%d%d%d",&L,&T,&O); 80 getchar(); 81 build(1,L,1); 82 while(O--) 83 { 84 scanf("%c",&ch); 85 if(ch=='C') 86 { 87 scanf("%d%d%d",&a,&b,&c); 88 if(a>b) 89 swap(a,b); 90 insert1(1,a,b,c); 91 } 92 else if(ch=='P') 93 { 94 scanf("%d%d",&a,&b); 95 memset(tab,false,sizeof(tab)); 96 if(a>b) swap(a,b); 97 serch(a,b,1); 98 int num=0; 99 for(int i=1; i<=T; i++) 100 { 101 if(tab[i]) num++; 102 } 103 printf("%d ",num); 104 } 105 getchar(); 106 } 107 return 0; 108 }