题意:P是给线段涂色,Q是查询
思路:线段树
代码如下:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
using namespace std;
struct node {
int l;
int r;
int value;
}tree[6000010];
int co[40];
void build (int root,int l,int r){
tree[root].l =l;
tree[root].r = r;
if(l==r){
return;
}
int mid = (l+r)/2;
build(root*2,l,mid);
build(root*2+1,mid+1,r);
}
void update(int root,int l,int r,int value){
if(tree[root].l == l && tree[root].r == r){
tree[root].value = value;
return;
}
if(tree[root].value!=0){
tree[2*root].value=tree[root].value;
tree[root*2+1].value=tree[root].value;
tree[root].value=0;
}
int mid = (tree[root].l+tree[root].r)/2;
if(r<=mid){
update(root*2,l,r,value);
}else{
if(l>mid){
update(root*2+1,l,r,value);
}else{
update(root*2,l,mid,value);
update(root*2+1,mid+1,r,value);
}
}
}
void query(int root,int l,int r){
if(tree[root].l==l && tree[root].r == r && tree[root].value!=0){
//cout<<tree[root].l<<" l-r "<<tree[root].r<<" value "<<tree[root].value<<endl;
co[tree[root].value]=1;
return;
}
if(tree[root].value!=0){
tree[2*root].value=tree[root].value;
tree[root*2+1].value=tree[root].value;
tree[root].value=0;
}
int mid = (tree[root].l+tree[root].r)/2;
if(r<=mid){
query(root*2,l,r);
}else{
if(l>mid){
query(root*2+1,l,r);
}else{
query(root*2,l,mid);
query(root*2+1,mid+1,r);
}
}
}
int main(){
int n,m;
//freopen("data.txt","r",stdin);
while(scanf("%d %d",&n,&m)){
if(n==0&&m==0)
break;
getchar();
for(int i=0;i<=2*n+100;i++){
tree[i].value=2;
}
build(1,1,n+1);
char ch;
for(int i=0;i<m;i++)
{
scanf("%c ",&ch);
if(ch=='P')
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
getchar();
update(1,a,b,c);
}
if(ch=='Q')
{
for(int i=1;i<=30;i++)
co[i]=0;
int a,b;
scanf("%d %d",&a,&b);
getchar();
query(1,a,b);
int ct=1;
while(1)
{
if(co[ct])
{
printf("%d",ct);
break;
}
ct++;
}
for(ct++;ct<31;ct++)
{
if(co[ct]==1)
{
printf(" %d",ct);
}
}
printf("\n");
}
}
}
return 0;
}