RECORD : LINK
RE 信息显示Aborted / IOT trap.。是 set 越界?还是什么其他原因?求助/kk
code :
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
using namespace std;
struct stu{
int f,t;
long long v;
stu(int a,int b=0,int c=0){f=a,t=b,v=c;}
bool operator <(const stu &a)const{
return f<a.f;
}
};
#define IT set<stu>::iterator
#define check for(auto it=s.begin();it!=s.end();it++){cout<<it->f<<"->"<<it->t<<'='<<it->v<<"\n";}
set<stu>s;
void mdf(int f,int t,int c){
IT itl=s.lower_bound(stu(f));if(itl==s.end()||itl->f>f)itl--;
if(itl->v==c){
f=itl->f;
}else{
int x=itl->f,ccc=itl->v;
if(itl->f!=f){
s.erase(itl);
itl=s.insert(stu(x,f-1,ccc)).first;itl++;
}
}
IT itr=s.lower_bound(stu(t));if(itr==s.end()||itr->f>t)itr--;
if(itr->v==c){
//末端合并
t=itr->t;
}else{
int x=itr->t,ccc=itr->v;
if(itr->t!=t){
s.erase(itr);
itr=s.insert(stu(t+1,x,ccc)).first;itr--;
}
}
IT del=itr;
do{
itr--;
s.erase(del);
del=itr;
}while(itr->f>=f);
IT it=s.insert(stu(f,t,c)).first;
if(it!=s.end()){
IT nxt=it;nxt++;
if(nxt->v==it->v){
int t=nxt->t,f=it->f,c=it->v;
s.erase(nxt);s.erase(it);
it=s.insert(stu(f,t,c)).first;
}
}
if(it!=s.begin()){
IT lst=it;lst--;
if(lst->v==it->v){
int f=lst->f,t=it->t,c=it->v;
s.erase(it);s.erase(lst);
it=s.insert(stu(f,t,c)).first;
}
}
}
int qus(int l,int r){
auto itl=s.lower_bound(stu(l)),itr=s.lower_bound(stu(r));
if(itl==s.end()||itl->f>l)itl--;
if(itr==s.end()||itr->f>r)itr--;
if(itl->f!=itr->f)return -1;
if(itl->f<l&&itl->t>r)return -2;
if(itl->f<l||itl->t>r)return 1;
if(itl->v==-1||(++itr)->v==-1)return 2;
return (--itl)->v!=itr->v?3:-3;
}
int main(){
int n;cin>>n;
char ch=getchar();while(ch<'A'||ch>'C')ch=getchar();
int lst=ch,cnt=1;
for(int i=1;i<n;i++){
ch=getchar();
if(ch==lst)cnt++;
else {
s.insert(stu(i-cnt+1,i,lst-'A'+1));
cnt=1;
}
lst=ch;
}
s.insert(stu(n-cnt+1,n,lst-'A'+1));
s.insert(stu(-114514,-3,-1));
s.insert(stu(-2,-2,-1));s.insert(stu(-1,-1,-1));s.insert(stu(0,0,-1));
s.insert(stu(n+1,n+1,-1));s.insert(stu(n+2,n+2,-1));s.insert(stu(n+2,n+2,-1));
s.insert(stu(n*5,n*10,-1));
int m;cin>>m;
// check
while(m--){
char ch;cin>>ch;int l,r;cin>>l>>r;
if(ch=='A'){
char x;cin>>x;x=x-'A'+1;
mdf(l,r,x);
}else{
cout<<(qus(l,r)<0?"No":"Yes")<<endl;
}
// check
}
return 0;
}