悬一关
码风被感染了
#include<bits/stdc++.h>
using namespace std;
#define it set<node>::iterator
const int N = 5e5+100;
int n,m;
struct node
{
int l,r;
mutable char var;
};
char in[N];
set<node> a;
bool operator<(node x,node y)
{
return x.l<y.l;
}
it splite(int pos)
{
it p=--a.upper_bound({pos,0,0});
if((*p).l==pos)return p;
int l=(*p).l,r=(*p).r;
char c=(*p).var;
a.erase(p);
a.insert({l,pos-1,c});
return a.insert({pos,r,c}).first;
}
it un(it p)
{
p--;
it q=p;
p++;
int l=(*q).l,r=((*p)).r;
char c=(*p).var;
a.erase(p);
a.erase(q);
return a.insert({l,r,c}).first;
}
vector<it> era;
void op(int l,int r,char c)
{
it p,q,m;
m=splite(r+1);
q=splite(l);
for(;q!=m;q++)
{
era.push_back(q);
}
while(!era.empty())
{
a.erase(era.back());
era.pop_back();
}
q=a.insert({l,r,c}).first;
q--;
p=q;
q++;
if((*q).var==(*p).var)q=un(q);
q++;
m=q;
q--;
if((*q).var==(*m).var)un(m);
// ((*q)).var=c;
// if(*p.var==(*q).var)q=un(p,q);
// if((*q).var==*m.var)un(q,m);
}
bool find(int l,int r)
{
it p=a.upper_bound({l,0,0});
if(p!=a.upper_bound({r,0,0}))return 0;
if(l==1||r==n)return 1;
p--;
char c,d;
if(l==(*p).l)
{
p--;
c=(*p).var;
p++;
}
else c=(*p).var;
if(r==(*p).r)
{
p++;
d=(*p).var;
}
else d=(*p).var;
return c!=d;
}
int main()
{
a.insert({1,n,in[1]});
it q,p;
cin>>n;
cin>>in+1;
for(int i=2;i<=n;i++)
{
if(in[i]!=in[i-1])
{
p=splite(i);
p--;
q=p;
p++;
(*q).var=in[i-1];
(*p).var=in[i];
// cout<<"size"<<a.size()<<'\n';
}
}
cin>>m;
char c;
int x,y;
char z;
for(int i=1;i<=m;i++)
{
cin>>c>>x>>y;
if(c=='B')
{
if(find(x,y))
{
cout<<"Yes\n";
}
else
{
cout<<"No\n";
}
}
else
{
cin>>z;
op(x,y,z);
}
// for(auto i:a)cout<<i.l<<' ';
}
}