数据中好像存在x>n的情况,反正下面这份代码RE了
#include<bits/stdc++.h>
using namespace std;
inline int read(){
char ch=getchar();
int f=1,x=0;
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
inline void work(int k){
if(k<0){
putchar('-');
k=-k;
}
if(k>9)
work(k/10);
putchar(k%10+'0');
}
int n,m,p,T[200005],las;
multiset<int> q;
struct node{
int val[800005],mx[800005];
int query(int k,int l,int r,int las){
if(l==r)
return mx[k]>las?las+l+1:1e9;
int mid=(l+r)>>1;
if(mx[2*k+1]>las)
return min(val[k],query(2*k+1,mid+1,r,las));//第一个比las大的位置
return query(2*k,l,mid,las);
}
void pushup(int k,int l,int r){
mx[k]=max(mx[2*k],mx[2*k+1]);
int mid=(l+r)>>1;
val[k]=query(2*k,l,mid,mx[2*k+1]);
}
void build(int k,int l,int r){
if(l==r){
mx[k]=T[l]-l+n-1;
val[k]=1e9;
return ;
}
int mid=(l+r)>>1;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
pushup(k,l,r);
}
void change(int k,int l,int r,int x,int v){
if(l>x||r<x)
return ;
if(l==r&&l==x){
mx[k]=v-l+n-1;
val[k]=1e9;
return ;
}
int mid=(l+r)>>1;
change(2*k,l,mid,x,v);
change(2*k+1,mid+1,r,x,v);
pushup(k,l,r);
}
}tree;
int main(){
n=read();
m=read();
p=read();
T[0]=1e9;
for(int i=1;i<=n;i++){
T[i]=read();
T[i+n]=T[i];
}
tree.build(1,1,n);
work(tree.query(1,1,n,tree.mx[1]-n));
putchar('\n');
while(m--){
int x,y;
x=read();
y=read();
if(p)
x^=las,y^=las;
assert(x<=n);/*成功的RE了,删掉能过*/
tree.change(1,1,n,x,y);
work(las=tree.query(1,1,n,tree.mx[1]-n));
putchar('\n');
}
return 0;
}