#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+10;
const int g=2,mod=1e9+7;
/*inline int fpow(int k)
{
int ans=1,bas=3;
while(k)
{
if(k&1) ans=ans*bas%mod;
bas=bas*bas%mod;
k>>=1;
}
return ans%mod;
}*/
inline int lowbit(int x){return x&(-x);}
int BIT1[maxn],BIT2[maxn],bas1[maxn],bas2[maxn];
int n,m;
void modify(int *num,int x,int c)
{
while(x<=n)
{
num[x]=(num[x]+c+mod)%mod;
x+=lowbit(x);
}
}
int ask(int *num,int x)
{
int ans=0;
while(x)
{
ans=ans+num[x]%mod;
x-=lowbit(x);
}
return ans%mod;
}
void updata(int *BIT,int *num,int x)
{
int lx;
while(x<=n)
{
BIT[x]=num[x];
lx=lowbit(x);
for(int i=1;i<lx;i<<=1)
BIT[x]=max(BIT[x],BIT[x-i]);
x+=lowbit(x);
}
}
int ask1(int *BIT,int *num,int l,int r)
{
int ans=-1;
while(r>=l)
{
ans=max(num[r],ans);
r--;
while(r-lowbit(r)>=l)
{
ans=max(BIT[r],ans);
r-=lowbit(r);
}
}
return ans;
}
int read(){
int X=0;char ch=0;
while(ch<48||ch>57)ch=getchar();
while(ch>=48&&ch<=57)X=X*10+(ch^48),ch=getchar();
return X;
}
int fpow[maxn];
signed main()
{
n=read(),m=read();
fpow[0]=1;
for(int i=1;i<=1000000;i++) fpow[i]=1ll*fpow[i-1]*g%mod;
for(int i=1;i<=n;i++)
{
int c=read();
bas1[i]=c;updata(BIT1,bas1,i);
modify(BIT2,i,fpow[c]);bas2[i]=fpow[c];
}
for(int i=1;i<=m;i++)
{
int opt=read();
if(opt==1)
{
int l1=read(),r1=read(),l2=read(),r2=read();
int min1=ask1(BIT1,bas1,l1,r1),min2=ask1(BIT1,bas1,l2,r2);
int k=min1-min2<0?min2-min1:min1-min2;
long long sum1=ask(BIT2,r1)-ask(BIT2,l1-1),sum2=ask(BIT2,r2)-ask(BIT2,l2-1);
//cout<<sum1<<' '<<sum2<<' ';
if(sum2*fpow[k]%mod==sum1||
sum1*fpow[k]%mod==sum2) cout<<"YES\n";
else cout<<"NO\n";
}
else
{
int x=read(),y=read();
modify(BIT2,x,-bas2[x]);
bas1[x]=y;updata(BIT1,bas1,x);
modify(BIT2,x,fpow[y]);bas2[x]=fpow[y];
}
}
return 0;
}
基本上采用的是维护bas的k次幂的方法,已经尝试过define int longlong之类的东西了