#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX 1000000
struct node
{
int left;
int right;
int value;
};
node tree[4*MAX];
int a[20000],cnt,n;
void Build_tree(int pos,int l,int r)
{
tree[pos].left=l;
tree[pos].right=r;
tree[pos].value=-1;
int mid=(l+r)/2;
if(l==r)
{
tree[pos].value=2;
return ;
}
Build_tree(pos*2,l,mid);
Build_tree(pos*2+1,mid+1,r);
}
void Update(int p,int v,int l,int r)
{
if(l<=tree[p].left&&tree[p].right<=r)
{
tree[p].value=v;
return ;
}
if(tree[p].value!=-1)
{
tree[p*2+1].value=tree[p*2].value=tree[p].value;
tree[p].value=-1;
}
int mid=(tree[p].left+tree[p].right)/2;
if(l>mid)
Update(p*2+1,v,l,r);
else if(r<=mid)
Update(p*2,v,l,r);
else
{
Update(p*2,v,l,mid);
Update(p*2+1,v,mid+1,r);
}
}
void Query(int p,int l,int r)
{
if(l<=tree[p].left&&tree[p].right<=r)
{
if(tree[p].value!=-1)
{
a[cnt++]=tree[p].value;
return ;
}
}
if(tree[p].value!=-1)
{
tree[p*2].value=tree[p*2+1].value=tree[p].value;
tree[p].value=-1;
}
int mid=(tree[p].left+tree[p].right)/2;
if(l>mid)
Query(p*2+1,l,r);
else if(r<=mid)
Query(p*2,l,r);
else
{
Query(p*2,l,mid);
Query(p*2+1,mid+1,r);
}
}
int main()
{
char str[20];
int m,i,j,l,r,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
Build_tree(1,1,n);
for(i=0;i<m;i++)
{
scanf("%s",&str);
if(str[0]=='P')
{
scanf("%d%d%d",&l,&r,&v);
Update(1,v,l,r);
}
else
{
cnt=0;
memset(a,0,sizeof(a));
scanf("%d%d",&l,&r);
Query(1,l,r);
sort(a,a+cnt);
printf("%d",a[0]);
for(j=1;j<cnt;j++)
if(a[j]!=a[j-1])
printf(" %d",a[j]);
printf("\n");
}
}
}
return 0;
}
HDU_5023 A Corrupt Mayor's Performance Art
最新推荐文章于 2019-08-18 20:39:43 发布