求大佬调
查看原帖
求大佬调
511423
jerry1717楼主2023/1/31 18:20
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+5,p=100000007;
int x,y,a[N],n,m,op,h;
struct node{
	int l,r,max,min;
	long long sum,sum2;
}t[N<<2];
void pushup(int u){
	t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
	t[u].sum2=t[u<<1].sum2+t[u<<1|1].sum2;
	t[u].max=max(t[u<<1].max,t[u<<1|1].max);
	t[u].min=min(t[u<<1].min,t[u<<1|1].min);
}
long long f(int kkk)
{
	if(kkk==0)return 1;
	long long q=f(kkk/2)%p;
	q=(q*q)%p;
	if(kkk%2==1)q=(q*2)%p;
	return q;
}
void build(int u,int l,int r){
	t[u].l=l,t[u].r=r;
	if(l==r){
		t[u].sum=a[l];
		t[u].max=a[l];
		t[u].min=a[l];
		t[u].sum2=f(a[l])%p;
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void update(int u,int x,int y){
	if(t[u].l==t[u].r){
		t[u].sum=y;
		t[u].max=y;
		t[u].min=y;
		t[u].sum2=f(y)%p;
		return;
	}
	int mid=t[u].l+t[u].r>>1;
	if(x<=mid)update(u<<1,x,y);
	else update(u<<1|1,x,y);
	pushup(u);
}
node query(int u,int l,int r){
	if(l<=t[u].l&&t[u].r<=r){
		return t[u];
	}
	int mid=t[u].l+t[u].r>>1;
	node ans;
	ans.sum=0;
	ans.max=-1321225477;
	ans.min=1321225477;
	if(l<=mid){
		node t1=query(u<<1,l,mid);
		ans.sum+=t1.sum;  
		ans.sum2+=t1.sum2%p;  
		ans.min=min(t1.min,ans.min);
		ans.max=max(t1.max,ans.max); 
	}
	if(r>mid){
		node t1=query(u<<1|1,mid+1,r);
		ans.sum+=t1.sum;
		ans.sum2+=t1.sum2%p;
		ans.min=min(t1.min,ans.min);
		ans.max=max(t1.max,ans.max);  
	}
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d",&op);
		if(op==1){
			int x,y;
			scanf("%d%d",&x,&y);
			x^=h;
			y^=h;
			update(1,x,y);
		}else{
			int l,r,k;
			scanf("%d%d%d",&l,&r,&k);
			l^=h;
			r^=h;
			k^=h;
			node t1=query(1,l,r);
			long long sum1=0;
			sum1=abs(f(t1.min)-f(t1.max)*2);
			if((t1.max+t1.min)*(r-l+1)/2==t1.sum&&(r-l)*k==t1.max-t1.min&&sum1==t1.sum2){
				printf("Yes\n");
				h++;
			}else{
				printf("No\n");
			}
		}
	}
	return 0;
}
2023/1/31 18:20
加载中...