社区讨论

0分求助

P6688可重集参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlh9kiiy
此快照首次捕获于
2026/02/11 08:00
4 周前
此快照最后确认于
2026/02/12 13:45
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define mp(a,b) make_pair(a,b)
using namespace std;

/*
刚刚我错过的大雨 握不住的盛夏 
飘过的云是你吗 一圈又一圈 
我多想是路过 你的风 
忍不住 落回你眼中 

凭什么绕不开 翻不过的盛夏 
有些远方 让风代替我们抵达 
没勇气说完的 那句话 
希望有人听过它  
*/
inline int read(){
	int a=0,b=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-')	b=-1;
		c=getchar();
	}
	while(isdigit(c)){
		a=(a<<1)+(a<<3)+(c-'0');
		c=getchar();
	}
	return a*b;
} 
inline void write(int x){
	if(x<0)	putchar('-'),x=-x;
	if(x>=10)	write(x/10);
	putchar(x%10+48);
}
inline void write1(int x){
	write(x),putchar(' ');
}
inline void write2(int x){
	write(x),putchar('\n');
}
const int N=1e6+15;
const int mod=998244353;
int n,m;

int pow3[N];

struct node{
	int l,r;	//代表维护的区间 
	int min_;	//代表最小值 
	int tot;	//代表和  
}tree[N*4];

void pushup(int id){
	tree[id].min_=min(tree[id*2].min_,tree[id*2+1].min_);
	tree[id].tot=(tree[id*2].tot+tree[id*2+1].tot)%mod;
}

void build(int id,int l,int r){
	tree[id].l=l,tree[id].r=r;
	if(l==r){
		tree[id].min_=read();
		tree[id].tot=pow3[tree[id].min_];
		return;
	}
	int mid=l+r>>1;
	build(id*2,l,mid),build(id*2+1,mid+1,r);
	pushup(id); 
} 
void modify(int id,int x,int y){
	int l=tree[id].l,r=tree[id].r;
	if(l==r){
		tree[id].min_=y;
		tree[id].tot=pow3[tree[id].min_];
		return;
	}
	int mid=l+r>>1;
	if(x<=mid)	modify(id*2,x,y);
	else		modify(id*2+1,x,y);
	pushup(id);
}

int query1(int id,int l,int r){
	int l1=tree[id].l,r1=tree[id].r;
	if(l1>=l&&r1<=r){
		return tree[id].min_;
	}
	int mid=l1+r1>>1,ret=1e18;
	if(l<=mid)	ret=min(ret,query1(id*2,l,r));
	if(r>mid)	ret=min(ret,query1(id*2+1,l,r));
	return ret;
}

int query2(int id,int l,int r){
	int l1=tree[id].l,r1=tree[id].r;
	if(l1>=l&&r1<=r){
		return tree[id].tot;
	}
	int mid=l1+r1>>1,ret=0;
	if(l<=mid)	ret+=query2(id*2,l,r);
	if(r>mid)	ret+=query2(id*2+1,l,r);
	return ret;
}

inline int qpow(int x,int y){
	if(y==0)	return 1;
	if(y==1)	return x;
	int ret=qpow(x,y/2);
	ret=ret*ret%mod;
	if(y&1)	ret=ret*x%mod;
	return ret;
}
#undef int
int main(){
	#define int long long
	n=read(),m=read();
	for(int i=1;i<=4000000;i++){
		tree[i].min_=1e18;	//免得某些不必要的麻烦  
	}
	pow3[0]=1;
	for(int i=1;i<=1000000;i++){
		pow3[i]=pow3[i-1]*3%mod;
	}
	build(1,1,n);
	while(m--){
		int op=read();
		if(op==0){
			int x=read(),y=read();
			modify(1,x,y);
		}
		else{
			int x=read(),y=read(),x2=read(),y2=read();
			int a1=query1(1,x,y),b1=query2(1,x,y);
			int a2=query1(1,x2,y2),b2=query2(1,x2,y2);
			if(b1*qpow(3,a2-a1+mod-1)%mod==b2)	puts("YES");
			else	puts("NO");
		}
	}
	putchar('\n');
	return 0;
}//一定要挽回罗琪钧的遗憾啊,一定会挽回罗琪钧的遗憾的! 

回复

0 条回复,欢迎继续交流。

正在加载回复...