社区讨论
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 条回复,欢迎继续交流。
正在加载回复...