Change the sum operation to OR.
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #define lson l,m,rt<<1 7 #define rson m+1,r,rt<<1|1 8 using namespace std; 9 const int maxn=1111111;10 int sum[maxn<<2];11 int col[maxn<<2];12 void up(int rt){13 sum[rt]=sum[rt<<1]|sum[rt<<1|1];14 }15 void down(int rt){16 if(col[rt]){17 col[rt<<1]=col[rt<<1|1]=col[rt];18 sum[rt<<1]=sum[rt<<1|1]=sum[rt];19 col[rt]=0;20 }21 }22 void build(int l,int r,int rt){23 col[rt]=0;24 sum[rt]=4;25 if(l==r)return;26 int m=(l+r)>>1;27 build(lson);28 build(rson);29 up(rt);30 }31 void update(int L,int R,int c,int l,int r,int rt){32 if(L<=l&&R>=r){33 col[rt]=c;34 sum[rt]=c;35 return;36 }37 down(rt);38 int m=(l+r)>>1;39 if(L<=m)update(L,R,c,lson);40 if(R>m)update(L,R,c,rson);41 up(rt);42 }43 int query(int L,int R,int l,int r,int rt){44 if(L<=l&&R>=r)return sum[rt];45 down(rt);46 int m=(l+r)>>1;47 int ans=0;48 if(L<=m)ans|=query(L,R,lson);49 if(m<R)ans|=query(L,R,rson);50 return ans;51 }52 int main()53 {54 // freopen("in","r",stdin);55 int n,q;56 while(scanf("%d%d",&n,&q)>0&&(n|q)){57 build(1,n,1);58 char ch[5];59 int a,b,c;60 while(q--){61 scanf("%s",ch);62 if(ch[0]==‘P‘){63 scanf("%d%d%d",&a,&b,&c);64 update(a,b,1<<c,1,n,1);65 }66 else {67 scanf("%d%d",&a,&b);68 int ans=query(a,b,1,n,1);69 int fir=0;70 for(int i=1;i<31;i++){71 if(ans&(1<<i)){72 if(fir)printf(" ");73 printf("%d",i);74 fir=1;75 }76 }77 puts("");78 }79 }80 }81 return 0;82 }
HDU 5023 a segment upt mayor's performance art (line segment tree)