InputThere are several test cases.
The first line contains two integers, N and M ,meaning that the wall is divided into N segments and there are M operations(0 < N <= 1,000,000; 0<M<=100,000)
Then M lines follow, each representing an operation. There are two kinds of operations, as described below:
a, b and c are integers. This operation means that mayor X painted all segments from segment a to segment b with color c ( 0 < a<=b <= N, 0 < c <= 30).
a and b are integers. This is a query operation. It means that someone asked that how many kinds of colors were there from segment a to segment b ( 0 < a<=b <= N).
Please note that the operations are given in time sequence.
The input ends with M = 0 and N = 0.OutputFor each query operation, print all kinds of color on the queried segments. For color 1, print 1, for color 2, print 2 ... etc. And this color sequence must be in ascending order.Sample Input
///color n 用位移 1 << n來記錄
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#define lson l,mid,t << 1
#define rson mid + 1,r,t << 1 | 1
using namespace std;
int tree[4000005];
int lazy[4000005];///初始爲0 表示原來是什麼顏色 當更新的區間只佔子樹一部分時 拆分子樹向下更新lazy 無關的區間不受影響,只更新範圍內的區間
void build(int l,int r,int t)
{
lazy[1] = 1 << 2;
tree[t] = 1 << 2;///The wall's original color was color 2
if(l == r)return;///線段樹的葉節點
int mid = (l + r) >> 1;///從中間分紅左右子樹
build(lson);
build(rson);
}
void update(int L,int R,int col,int l,int r,int t)///更新
{
if(r < L || l > R)return;///無交集
if(l >= L && r <= R)///當前子樹處於查詢範圍內
{
lazy[t] = 1 << col;
tree[t] = 1 << col;
return;
}
if(lazy[t])///當前子樹的顏色都是lazy[t] 向下更新 若是值是0,表示左右子樹原本就不一致
{
lazy[t << 1] = lazy[t << 1 | 1] = lazy[t];
tree[t << 1] = tree[t << 1 | 1] = tree[t];
lazy[t] = 0;///當前子樹裏的顏色已經不是全都一致的了
}
int mid = (l + r) >> 1;
update(L,R,col,lson);///當前子樹只有左子樹須要更新
update(L,R,col,rson);///當前子樹只有右子樹須要更新
tree[t] = tree[t << 1] | tree[t << 1 | 1];///向上更新 位或操做合併狀態
}
int query(int L,int R,int l,int r,int t)///查詢
{
if(l > R || r < L)return 0;///再也不區間內返回0 表示沒顏色
if(l >= L && r <= R || lazy[t])///子樹在查詢區間內 或者子樹狀態一致 直接返回
{
return tree[t];
}
int mid = (l + r) >> 1;
return query(L,R,lson) | query(L,R,rson);///返回顏色狀態的並集
}
int main()
{
int n,m,a,b,c;
char ch[2];
while(~scanf("%d%d",&n,&m)&&(n + m))
{
build(1,n,1);///建樹
while(m --)
{
scanf("%s",ch);
if(ch[0] == 'P')
{
scanf("%d%d%d",&a,&b,&c);
update(a,b,c,1,n,1);
}
else
{
scanf("%d%d",&a,&b);
int ans = query(a,b,1,n,1),flag = 0;
for(int i = 1;i <= 30;i ++)
if((ans >> i) & 1)
{
if(flag)printf(" %d",i);
else
{
flag = 1;
printf("%d",i);
}
}
putchar('\n');
}
}
}
}