数据疑似有误
查看原帖
数据疑似有误
682174
yz_by楼主2024/4/19 16:35

数据中好像存在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;
}
2024/4/19 16:35
加载中...