把求和操作改为或操作,就可以了。

 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 }