线段树染色题
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
char s[5];
int ans, tmp, col;
int del[maxn*2];
struct node{ int l, r, tag, v; } tree[maxn*4];
void build(int k,int l,int r)
{
tree[k].l = l; tree[k].r = r;
tree[k].tag = 0; tree[k].v = 1;
if(l == r) return ;
int mid = (l+r)>>1;
build(k<<1,l,mid); build(k<<1|1,mid+1,r);
}
void pushdown(int k)
{
tree[k].v = 0;
if(!tree[k].tag) return ;
tree[k<<1].tag = tree[k<<1|1].tag = tree[k].tag;
tree[k].tag = 0;
}
void update(int k,int l,int r)
{
if(tree[k].v){
if(tree[k].tag && !del[tree[k].tag]) ans--, tmp++;
del[tree[k].tag] = 1;
tree[k].tag = col;
return ;
}
tree[k].tag = col; tree[k].v = 1;
update(k<<1,l,r); update(k<<1|1,l,r);
}
void modify(int k,int l,int r)
{
if(tree[k].l >= l && tree[k].r <= r){
update(k,l,r); return ;
}
pushdown(k);
int mid = (tree[k].l+tree[k].r)>>1;
if(mid >= l) modify(k<<1,l,r);
if(mid < r) modify(k<<1|1,l,r);
}
int main()
{
int n, x, y;
scanf("%d",&n);
build(1,1,1e5);
for(int i = 1; i <= n; i++){
scanf("%s",s);
if(s[0] == 'A'){
ans++; tmp = 0; col++;
scanf("%d%d",&x,&y);
modify(1,x,y);
printf("%d\n",tmp);
}
else printf("%d\n",ans);
}
return 0;
}