o分求助(悬关qwq)
查看原帖
o分求助(悬关qwq)
300166
Zikl楼主2023/10/14 23:12

re+mle+wa

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define il inline
#define int long long
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
const int N=3e5+5;
il int read()
{
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
int n,m,a[N],anss;
struct node{
	int mn,mx,sum;
	node(){mn=1e9,mx=-1e9,sum=0;}
	node operator +(node x){
		node ans;
		ans.sum=sum+x.sum;
		ans.mx=max(mx,x.mx);
		ans.mn=max(mn,x.mn);
		return ans;
	}

}tree[N<<1];
void pushup(int x){
	tree[x].sum=tree[ls(x)].sum+tree[rs(x)].sum;
	tree[x].mn=min(tree[ls(x)].mn,tree[rs(x)].mn);
	tree[x].mx=max(tree[ls(x)].mx,tree[rs(x)].mx);
}
void build(int x,int l,int r){
	if(l==r){
		tree[x].sum=tree[x].mn=tree[x].mx=a[l];	
		return;
	}
	int mid=(l+r)>>1;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
	pushup(x);
}
void change(int u,int l,int r,int x,int v){
	if(l==r&&l==x){
		tree[u].sum=tree[u].mn=tree[u].mx=v;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
	change(ls(u),l,mid,x,v);
	else
	change(rs(u),mid+1,r,x,v);
	pushup(u);
}
node query(int u,int l,int r,int x,int y){
	if(l>=x&&y>=r){
		return tree[u];
	}
	int mid=(l+r)>>1;
	node ans=node();
	if(x<=mid)
	ans=ans+query(ls(u),l,mid,x,y);
	if(mid<y)
	ans=ans+query(rs(u),mid+1,r,x,y);
	return ans;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	while(m--){
		int opt=read(),x=read(),y=read();
		x^=anss,y^=anss;
		if(opt==1) change(1,1,n,x,y);
		if(opt==2) {
		int k=read();
		k^=anss;
		node zyy=query(1,1,n,x,y);
		if(zyy.mx-zyy.mn==(y-x)*k&&zyy.sum==(zyy.mx+zyy.mn)*(y-x+1)/2) 
		cout<<"Yes\n",anss++;
		else cout<<"No\n";
		}
	}
	return 0;
}

是数据加强了还是我有小错误没改到。

2023/10/14 23:12
加载中...