rt
感觉这么多个点才WA,应该可能大概是哈希的问题
#include<bits/stdc++.h>
#define ri register int
#define ll long long
#define ls i<<1
#define rs i<<1|1
#define mkp make_pair
using namespace std;
const int maxn=1e5+7;
const int mod=1e9+7;
const int base=1e5+7;
// 19:44-
const int invbase=193276472;
ll gsm[maxn];
ll invgsm[maxn];
struct hsh{
ll val,len;
bool operator == (const hsh &x)const{
return val==x.val&&len==x.len;
}
bool operator != (const hsh &x)const{
return val!=x.val||len!=x.len;
}
hsh operator + (const hsh &x)const{
if(x.len<0){
cout<<"you are big shabi\n";
}
return (hsh){(val+x.val*gsm[len]%mod)%mod,len+x.len};
}
hsh operator - (const hsh &x)const{
// cout<<val<<' '<<x.val<<' '<<x.len<<' '<<(val-x.val+mod)*invgsm[x.len]%mod<<endl;
return (hsh){(val-x.val+mod)*invgsm[x.len]%mod,len-x.len};
}
};
int n;
int a[maxn];
struct SegT{
struct node{
int l,r;
hsh lh,rh,hh;
bool ok;
}tree[maxn<<2];
hsh get_left(int i,int len){
if(len==0)return (hsh){0,0};
if(len==tree[i].lh.len)return tree[i].lh;
if(len<=tree[ls].lh.len)return get_left(ls,len);
return tree[ls].lh+(get_left(rs,len-tree[ls].lh.len+tree[ls].rh.len)-tree[ls].rh);
}
hsh get_right(int i,int len){
if(len==0)return (hsh){0,0};
if(len==tree[i].rh.len)return tree[i].rh;
if(len<=tree[rs].rh.len)return get_right(rs,len);
return tree[rs].rh+(get_right(ls,len-tree[rs].rh.len+tree[rs].lh.len)-tree[rs].lh);
}
void push_up(int i){
tree[i].ok=tree[ls].ok&tree[rs].ok;
if(tree[ls].rh.len<=tree[rs].lh.len){
if(get_left(rs,tree[ls].rh.len)==tree[ls].rh){
tree[i].lh=tree[ls].lh+(tree[rs].lh-tree[ls].rh);
tree[i].rh=tree[rs].rh;
}else tree[i].ok=0;
}
else{
if(get_right(ls,tree[rs].lh.len)==tree[rs].lh){
tree[i].lh=tree[ls].lh;
tree[i].rh=tree[rs].rh+(tree[ls].rh-tree[rs].lh);
// if(tree[i].rh.val==base){
// cout<<(tree[ls].rh-tree[rs].lh).val<<endl;
// }
}else tree[i].ok=0;
}
}
void build(int i,int l,int r){
tree[i].l=l,tree[i].r=r;
tree[i].ok=1;
if(tree[i].l==tree[i].r){
if(a[l]>0){
tree[i].lh=(hsh){0,0};
tree[i].rh=(hsh){a[l],1};
}
else{
tree[i].lh=(hsh){-a[l],1};
tree[i].rh=(hsh){0,0};
}return;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
push_up(i);
}
void update(int i,int p,int k){
if(tree[i].l==tree[i].r){
if(k>0){
tree[i].lh=(hsh){0,0};
tree[i].rh=(hsh){k,1};
}
else{
tree[i].lh=(hsh){-k,1};
tree[i].rh=(hsh){0,0};
}return;
}
int mid=tree[i].l+tree[i].r>>1;
if(p<=mid)update(ls,p,k);
else update(rs,p,k);
push_up(i);
}
pair<bool,pair<hsh,hsh> > query(int i,int l,int r){
if(l<=tree[i].l&&tree[i].r<=r){
return mkp(tree[i].ok,mkp(tree[i].lh,tree[i].rh));
}
int mid=tree[i].l+tree[i].r>>1;
if(l<=mid&&r>mid){
pair<bool,pair<hsh,hsh> >a,b,ans;
a=query(ls,l,r);
b=query(rs,l,r);
ans.first=a.first&b.first;
if(!ans.first){
// ans.second=mkp(hsh{0,0},0);
return ans;
}
if(a.second.second.len<=b.second.first.len){
if(a.second.second==get_left(rs,a.second.second.len)){
ans.second.first=a.second.first+(b.second.first-a.second.second);
ans.second.second=b.second.second;
}
else {
ans.first=0;
}
}
else{
if(b.second.first==get_right(ls,b.second.first.len)){
ans.second.first=a.second.first;
ans.second.second=b.second.second+(a.second.second-b.second.first);
}
else {
ans.first=0;
}
}
// cout<<tree[i].l<<' '<<tree[i].r<<' '<<ans.first<<' '<<ans.second.first.val<<' '<<ans.second.first.len<<' '<<ans.second.second.val<<' '<<ans.second.second.len<<endl;
return ans;
}
else if(l<=mid){
return query(ls,l,r);
}
else{
return query(rs,l,r);
}
}
}tree;
int k;
int main(){
ios::sync_with_stdio(0);
// cout<<1ll*base*invbase%mod;
cin>>n>>k;
for(ri i=1;i<=n;i++)cin>>a[i];
gsm[0]=invgsm[0]=1;
for(ri i=1;i<=n;i++){
gsm[i]=gsm[i-1]*base%mod;
invgsm[i]=invgsm[i-1]*invbase%mod;
}
// for(ri i=1;i<=n;i++){
// cout<<invgsm[i]<<' ';
// }
// cout<<endl;
tree.build(1,1,n);
int q;cin>>q;
while(q--){
int op,a,b;cin>>op>>a>>b;
if(op==1){
tree.update(1,a,b);
}else{
pair<bool,pair<hsh,hsh> >ans=tree.query(1,a,b);
// cout<<ans.second.first.len<<' '<<ans.second.second.len<<endl;
cout<<((ans.first&&ans.second.second.len==0&&ans.second.first.len==0)?"Yes":"No")<<endl;
}
// for(ri i=1;i<=n<<1;i++)cout<<tree.tree[i].l<<' '<<tree.tree[i].r<<' '<<tree.tree[i].ok<<' '<<tree.tree[i].lh.val<<' '<<tree.tree[i].rh.val<<endl;
}
return 0;
}
/*
10 10
10 4 2 -2 1 -1 -4 8 -8 -10
8
1 1 4
1 10 -4
2 6 9
1 3 4
1 4 -4
2 2 8
2 3 4
2 2 9
*/