只有1号点WA掉了……
第 199909 行 Yes 判成了 No
翻看了之前能看到的所有提交记录,没有发现和我错的一样的……
同时尝试了讨论区所有hack,都过了。
求调。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,inf=1e18;
int n,m,a[N],pre[N],nxt[N];
struct node{
int minn,maxx,gcd,pre;
}tr[N<<2];
map<int,set<int> > mp;
void push_up(int u){
tr[u].minn=min(tr[u<<1].minn,tr[u<<1|1].minn);
tr[u].maxx=max(tr[u<<1].maxx,tr[u<<1|1].maxx);
tr[u].gcd=__gcd(tr[u<<1].gcd,tr[u<<1|1].gcd);
tr[u].pre=max(tr[u<<1].pre,tr[u<<1|1].pre);
}
void build(int l,int r,int u){
if(l==r){
tr[u].minn=tr[u].maxx=a[l];
tr[u].gcd=abs(a[l]-a[l-1]);
tr[u].pre=pre[l];
if(l==1) tr[u].gcd=abs(a[2]-a[1]);
return ;
}
int mid=(l+r)>>1;
build(l,mid,u<<1);
build(mid+1,r,u<<1|1);
push_up(u);
}
void update(int ll,int rr,int l,int r,int x,int y,int u){
if(ll<=l&&rr>=r){
tr[u].maxx=tr[u].minn=x;
tr[u].pre=y;
tr[u].gcd=abs(a[l]-a[l-1]);
if(l==1) tr[u].gcd=abs(a[2]-a[1]);
return ;
}
int mid=(l+r)>>1;
if(ll<=mid) update(ll,rr,l,mid,x,y,u<<1);
if(rr>mid) update(ll,rr,mid+1,r,x,y,u<<1|1);
push_up(u);
}
node query(int ll,int rr,int l,int r,int u){
if(ll<=l&&rr>=r) return tr[u];
int mid=(l+r)>>1;
node res={inf,0,0,0},res1={inf,0,0,0},res2={inf,0,0,0};
if(ll<=mid) res1=query(ll,rr,l,mid,u<<1);
if(rr>mid) res2=query(ll,rr,mid+1,r,u<<1|1);
res.minn=min(res1.minn,res2.minn);
res.maxx=max(res1.maxx,res2.maxx);
res.pre=max(res1.pre,res2.pre);
return res;
}
int query1(int ll,int rr,int l,int r,int u){
if(ll<=l&&rr>=r) return tr[u].gcd;
int mid=(l+r)>>1,res=0,res1=0,res2=0;
if(ll<=mid) res1=query1(ll,rr,l,mid,u<<1);
if(rr>mid) res2=query1(ll,rr,mid+1,r,u<<1|1);
if(!res1) res=res2;
else if(!res2) res=res1;
else res=__gcd(res1,res2);
return res;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
if(mp[a[i]].empty()) pre[i]=0;
else pre[i]=*--mp[a[i]].end();
nxt[pre[i]]=i;
mp[a[i]].insert(i);
}
build(1,n,1);
int ans=0;
while(m--){
int op,x,y,k;
cin>>op>>x>>y;
x^=ans,y^=ans;
if(op==1){
mp[a[x]].erase(x);
mp[y].insert(x);
a[x]=y;
if(nxt[x]){
if(*mp[a[nxt[x]]].begin()==nxt[x]) pre[nxt[x]]=0;
else pre[nxt[x]]=*--mp[a[nxt[x]]].lower_bound(nxt[x]);
}
if(*--mp[a[x]].end()==x) nxt[x]=0;
else nxt[x]=*mp[a[x]].upper_bound(x),pre[nxt[x]]=x;
if(pre[x]){
if(*--mp[a[pre[x]]].end()==pre[x]) nxt[pre[x]]=0;
else nxt[pre[x]]=*mp[a[pre[x]]].upper_bound(pre[x]);
}
if(*mp[a[x]].begin()==x) pre[x]=0;
else pre[x]=*--mp[a[x]].lower_bound(x),nxt[pre[x]]=x;
update(x,x,1,n,y,pre[x],1);
if(x!=n) update(x+1,x+1,1,n,a[x+1],pre[x+1],1);
}
else{
cin>>k;
k^=ans;
if(x==y){
cout<<"Yes"<<'\n';
ans++;
continue;
}
node res=query(x,y,1,n,1);
int gcd=query1(x+1,y,1,n,1);
if(k==0){
if(res.minn==res.maxx) cout<<"Yes"<<'\n',ans++;
else cout<<"No"<<'\n';
continue;
}
if(res.maxx!=res.minn+(y-x)*k){
cout<<"No"<<'\n';
continue;
}
if(gcd!=k){
cout<<"No"<<'\n';
continue;
}
if(res.pre>=x){
cout<<"No"<<'\n';
continue;
}
cout<<"Yes"<<'\n';
ans++;
}
}
}