//线段树(区间更新)
//用 c++ 交就是RE,换成 g++ 过了
#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 3000010;//这里要稍微开大点,不然容易RE
vector<int>ve;
int y1, y2, v;
int setv[maxn<<2];
void maintain(int o){
int lc = o * 2, rc = o * 2 + 1;
}
void build_tree(int o, int L, int R){
int lc = o * 2, rc = o * 2 + 1;
setv[o] = 2;
if( L == R )return ;
int M = ( R + L ) / 2;
build_tree(lc, L, M);
build_tree(rc, M+1,R);
}
void pushdown(int o, int L ,int R){
int lc = o * 2, rc = o * 2 + 1;
if(setv[o]>0&&setv[o]<=30){
int M = ( R + L ) / 2;
setv[lc] = setv[rc] = setv[o];
setv[o] = -1;
}
return ;
}
void update(int o, int l, int r){
int lc = o*2, rc = o*2+1;
if(y1<=l&&y2>=r){
setv[o] = v;return ;
}
else
{
pushdown(o,l,r);
int m = (l+r)/2;
if(y1<=m)update(lc, l, m);
if(y2>m)update(rc, m+1, r);
}
}
void query(int o, int l, int r)
{
if(setv[o]>=0&&setv[o]<=30){
ve.push_back(setv[o]);
}
else {
int m = (l+r)/2;
if(y1<=m)query(o*2,l,m);
if(y2>m)query(o*2+1,m+1,r);
}
}
int main(){
//freopen("in.txt","r",stdin);
int n,m;
char ch[3];
while(~scanf("%d%d",&n,&m),n||m){
ve.clear();
memset(setv,0,sizeof(setv));
build_tree(1,1,n);
for(int i=0;i<m;++i){
scanf("%s%d%d",ch,&y1,&y2);
if(ch[0]=='P'){
scanf("%d",&v);
update(1,1,n);
}
else if(ch[0]=='Q'){
query(1,1,n);
sort(ve.begin(),ve.end());
ve.erase(unique(ve.begin(),ve.end()),ve.end());
int len = ve.size();
ve[len] = -1;
for(int j = 0; j < len; ++j){
j == len-1 ? printf("%d\n",ve[j]) : printf("%d ",ve[j]);
}
ve.clear();
}
}
}
return 0;
}
HDOJ 5023 A Corrupt Mayor's Performance Art
最新推荐文章于 2016-02-05 23:49:21 发布