#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxlen=1000000,mod=998244353,base=1000007;
int n,q,opt,x,y,x2,y2,tim;
int a[maxlen+5],num[maxlen+5],tree[8*maxlen+5],tag[8*maxlen+5],ltree[4*maxlen+5];
inline void pushup(int rt)
{
tree[rt]=max(tree[rt<<1],tree[(rt<<1)|1]);
}
int quick_power(int x,int y)
{
int res=1;
for (;y;y=y>>1,x=(x*x)%mod)
{
if (y&1) res=(res*x)%mod;
}
return res;
}
inline void build_tree(int l,int r,int rt)
{
if (l==r)
{
tree[rt]=a[l];
return;
}
int mid=(l+r)>>1;
build_tree(l,mid,rt<<1);
build_tree(mid+1,r,(rt<<1)|1);
pushup(rt);
}
inline void f(int l,int r,int rt,int k)
{
tree[rt]+=k;
tag[rt]+=k;
}
inline void pushdown(int l,int r,int rt)
{
int mid=(l+r)>>1;
f(l,mid,rt<<1,tag[rt]);
f(mid+1,r,(rt<<1)|1,tag[rt]);
tag[rt]=0;
}
inline void change(int nl,int nr,int l,int r,int rt,int k)
{
if (nl<=l&&r<=nr)
{
f(l,r,rt,k);
return;
}
pushdown(l,r,rt);
int mid=(l+r)>>1;
if (nl<=mid) change(nl,nr,l,mid,rt<<1,k);
if (nr>mid) change(nl,nr,mid+1,r,(rt<<1)|1,k);
pushup(rt);
}
inline int query(int nl,int nr,int l,int r,int rt)
{
int mid=(l+r)>>1,ans=0;
pushdown(l,r,rt);
if (nl<=l&&r<=nr) return tree[rt];
if (nl<=mid) ans=max(ans,query(nl,nr,l,mid,rt<<1));
if (nr>mid) ans=max(ans,query(nl,nr,mid+1,r,(rt<<1)|1));
return ans;
}
inline int lowbit(int k)
{
return k&(-k);
}
inline void change_ltree(int rt,int num)
{
while (rt<=n)
{
ltree[rt]=(ltree[rt]+num)%mod;
rt+=lowbit(rt);
}
}
inline int query_ltree(int rt)
{
int tot=0;
while (rt>=1)
{
tot=tot+ltree[rt];
rt-=lowbit(rt);
}
return tot%mod;
}
inline int query2(int l,int r)
{
return ((query_ltree(r)-query_ltree(l-1))%mod+mod)%mod;
}
inline int read()
{
int s=0,w=1;
char ch=getchar();
while (ch<'0'||ch>'9')
{
if (ch=='-') w=-w;
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
s=(s<<1)+(s<<3)+(ch^'0');
ch=getchar();
}
return s*w;
}
signed main()
{
cin>>n>>q;
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=n;i++)
{
num[i]=quick_power(base,a[i]);
change_ltree(i,num[i]);
}
build_tree(1,n,1);
while (q--)
{
opt=read();
if (opt==0)
{
x=read(),y=read();
change(x,x,1,n,1,y-a[x]);
a[x]=y;
change_ltree(x,((quick_power(base,y)-num[x])%mod+mod)%mod);
num[x]=quick_power(base,y);
}
else
{
x=read(),y=read(),x2=read(),y2=read();
tim=query(x2,y2,1,n,1)-query(x,y,1,n,1);
if (tim<0&&(query2(x2,y2)*quick_power(base,-tim))%mod==query2(x,y)%mod)
{
puts("YES");
}
else if (tim>=0&&(query2(x,y)*quick_power(base,tim))%mod==query2(x2,y2)%mod) puts("YES");
else puts("NO");
}
}
return 0;
}
保证代码的正确性以及时间复杂度(不含常数)的正确性(只有AC和TLE),只需要提建议就可以啦QAQ
register加了并没有什么效果QWQ