自己手写的,Sub 0全Wa,Sub 1全Ac,不知道是思路错了还是写挂了。
#include<bits/stdc++.h>
#define N 500010
#define lt (p<<1)
#define rt (p<<1|1)
#define mid (l+r>>1)
#define I_love_Furina return
//#define int long long
using namespace std;
int n,T,m;
char ch;
struct node{int tag,x;}a[N<<2];
inline int gt(char ch){
if(ch=='A')I_love_Furina 1;
if(ch=='B')I_love_Furina 2;
if(ch=='C')I_love_Furina 3;
}
inline int pushup(int x,int y){
if(a[x].x!=a[y].x)return -1;
else return a[x].x;
}
inline void pushdown(int p){
if(!a[p].tag)I_love_Furina ;
a[lt].tag=a[rt].tag=a[lt].x=a[rt].x=a[p].tag;
}
inline void build(int p,int l,int r){
if(l==r){cin>>ch,a[p].x=gt(ch);I_love_Furina ;}
build(lt,l,mid),build(rt,mid+1,r),a[p].x=pushup(lt,rt);
}
inline void update(int p,int L,int R,int l,int r,int x){
if(L<=l&&r<=R)I_love_Furina (void)(a[p].tag=a[p].x=x);
pushdown(p);
if(mid>=L)update(lt,L,R,l,mid,x);
if(mid+1<=R)update(rt,L,R,mid+1,r,x);
a[p].x=pushup(lt,rt);
}
inline int query(int p,int L,int R,int l,int r){
if(L<=l&&r<=R)I_love_Furina a[p].x;
pushdown(p);
if(mid>=R)I_love_Furina query(lt,L,R,l,mid);
if(mid+1<=L)I_love_Furina query(rt,L,R,mid+1,r);
int x=query(lt,L,R,l,mid),y=query(rt,L,R,mid+1,r);
if(x!=y)I_love_Furina -1;else I_love_Furina x;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
build(1,1,n);
cin>>m;
while(m--){
int l,r;
cin>>ch>>l>>r;
char x;
if(ch=='A')cin>>x,update(1,l,r,1,n,gt(x));
else {
if(l-1>=1&&r+1<=n&&query(1,l-1,l-1,1,n)==query(1,r+1,r+1,1,n)||query(1,l,r,1,n)==-1)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
}