感觉能加的优化都加了,但是还是稳稳地T了5个点,可以开大一点时限吗?
(或者是我错了?)
#include<stdio.h>
#define inf 1000000000
const int maxn=1000005;
const long long Base=5,mod=1777771;
int i,j,k,m,n,opt,x,y,l1,r1,l2,r2,minn1,minn2,maxx1,maxx2,sum1,sum2,flg;
long long pow[maxn],a[maxn];
inline long long min(long long a,long long b){
return a<b? a:b;
}
inline long long max(long long a,long long b){
return a>b? a:b;
}
inline int read(){
int x=0;
char c=getchar();
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar())
x=x*10+c-48;
return x;
}
struct Segment_Tree{
int lc[maxn<<2],rc[maxn<<2];
long long minn[maxn<<2],maxx[maxn<<2],sum[maxn<<2];
inline void pushup(int now){
minn[now]=min(minn[lc[now]],minn[rc[now]]);
maxx[now]=max(maxx[lc[now]],maxx[rc[now]]);
sum[now]=(sum[lc[now]]+sum[rc[now]])%mod;
}
void build(int l,int r,int now){
if(l==r){
minn[now]=maxx[now]=a[l],sum[now]=pow[a[l]];
return ;
}
int mid=(l+r)>>1;
lc[now]=now<<1,rc[now]=now<<1|1;
build(l,mid,lc[now]),build(mid+1,r,rc[now]);
pushup(now);
}
void modify(int l,int r,int now,int pos,long long v){
if(l==r){
minn[now]=maxx[now]=v,sum[now]=pow[v];
return ;
}
int mid=(l+r)>>1;
if(pos<=mid)
modify(l,mid,lc[now],pos,v);
if(mid<pos)
modify(mid+1,r,rc[now],pos,v);
pushup(now);
}
int query(int l,int r,int now,int L,int R,int t){
if(L<=l&&r<=R)
return t==0? sum[now]:(t==1? minn[now]:maxx[now]);
int mid=(l+r)>>1,res=t==0? 0:(t==1? inf:-inf);
if(L<=mid)
res=t==0? (res+query(l,mid,lc[now],L,R,t))%mod:(t==1? min(res,query(l,mid,lc[now],L,R,t)):max(res,query(l,mid,lc[now],L,R,t)));
if(mid<R)
res=t==0? (res+query(mid+1,r,rc[now],L,R,t))%mod:(t==1? min(res,query(mid+1,r,rc[now],L,R,t)):max(res,query(mid+1,r,rc[now],L,R,t)));
return res;
}
}ST;
int main(){
pow[0]=1;
for(i=1;i<maxn;i++)
pow[i]=pow[i-1]*Base%mod;
n=read(),m=read();
for(i=1;i<=n;i++)
a[i]=read();
ST.build(1,n,1);
for(i=1;i<=m;i++){
opt=read();
if(opt==0){
x=read(),y=read();
ST.modify(1,n,1,x,y);
}
if(opt==1){
l1=read(),r1=read(),l2=read(),r2=read();
minn1=ST.query(1,n,1,l1,r1,1),minn2=ST.query(1,n,1,l2,r2,1);
maxx1=ST.query(1,n,1,l1,r1,2),maxx2=ST.query(1,n,1,l2,r2,2);
if(minn1-minn2==maxx1-maxx2){
sum1=ST.query(1,n,1,l1,r1,0),sum2=ST.query(1,n,1,l2,r2,0);
flg=minn1<=minn2? sum1*pow[minn2-minn1]%mod==sum2:sum2*pow[minn1-minn2]%mod==sum1;
}
else flg=0;
if(flg==1)
putchar('Y'),putchar('E'),putchar('S');
else putchar('N'),putchar('O');
putchar('\n');
}
}
return 0;
}