第一道线段树 简单线段树
只要修改其插入操作即可
#include <iostream>
#include <cstring>
#define maxn 700000
using namespace std;
int n,t,o;
bool vis[32];
struct node
{
int left,right,mid,cover,f,color;
}seg_tree[3*maxn];
void make(int l,int r,int num)
{
seg_tree[num].left=l;
seg_tree[num].right=r;
seg_tree[num].mid=(l+r)/2;
seg_tree[num].color=1;
if(l!=r)
{
make(l,seg_tree[num].mid,2*num);
make(seg_tree[num].mid+1,r,2*num+1);
}
}
void update(int l,int r,int c,int num)
{
if(seg_tree[num].left==l && seg_tree[num].right==r)
{
seg_tree[num].color=c;
return ;
}
if(seg_tree[num].color==c)
return ;
if(seg_tree[num].color!=-1)
{
seg_tree[2*num].color=seg_tree[num].color;
seg_tree[2*num+1].color=seg_tree[num].color;
seg_tree[num].color=-1;
}
if(r<=seg_tree[num].mid)
update(l,r,c,2*num);
else if(l>seg_tree[num].mid)
update(l,r,c,2*num+1);
else
{
update(l,seg_tree[num].mid,c,2*num);
update(seg_tree[num].mid+1,r,c,2*num+1);
}
}
void query(int l,int r,int num)
{
if(seg_tree[num].color!=-1)
{
vis[seg_tree[num].color]=1;
return ;
}
if(r<=seg_tree[num].mid)
query(l,r,2*num);
else if(l>seg_tree[num].mid)
query(l,r,2*num+1);
else
{
query(l,seg_tree[num].mid,2*num);
query(seg_tree[num].mid+1,r,2*num+1);
}
}
int main()
{
int i,j,cnt,a,b,c,tmp;
char s[3];
while(scanf("%d%d%d",&n,&t,&o)!=EOF)
{
make(1,n,1);
for(i=1;i<=o;i++)
{
scanf("%s%d%d",s,&a,&b);
if(a>b)
{
tmp=a;
a=b;
b=tmp;
}
if(s[0]=='C')
{
scanf("%d",&c);
update(a,b,c,1);
}
else
{
memset(vis,0,sizeof(vis));
query(a,b,1);
cnt=0;
for(j=1;j<=30;j++)
if(vis[j]==1)
cnt++;
printf("%d/n",cnt);
}
}
}
return 0;
}