牛客裸题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+5;
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
int a[maxn];
int n,q;
struct node{
int l,r;
int mx,mi;// 区间最值
}t[maxn*4];
void pushup(int p)
{
t[p].mx = max( t[ls(p)].mx,t[rs(p)].mx );
t[p].mi = min( t[ls(p)].mi,t[rs(p)].mi );
}
void build(int p,int l,int r)
{
t[p].l = l, t[p].r = r;
if( l==r )
{
t[p].mi = t[p].mx = a[l];
return ;
}
int mid = (l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
// 单点修改
void update(int p,int x,int y)
{
if( t[p].l==x && t[p].r==x )
{
t[p].mi = t[p].mx = y;
return ;
}
int mid = (t[p].l+t[p].r)>>1;
if( x<=mid ) update(ls(p),x,y);
else update(rs(p),x,y);
pushup(p);
}
int query_mx(int p,int l,int r)
{
if( l<=t[p].l && t[p].r<=r ) return t[p].mx;
int mid = (t[p].l+t[p].r)>>1;
int ans = -1e9;
if( l<=mid ) ans = max( ans , query_mx(ls(p),l,r) );
if( r>=mid+1 ) ans = max( ans,query_mx(rs(p),l,r) );
return ans;
}
int query_mi(int p,int l,int r)
{
if( l<=t[p].l && t[p].r<=r ) return t[p].mi;
int mid = (t[p].l+t[p].r)>>1;
int ans = 1e9;
if( l<=mid ) ans = min( ans , query_mi(ls(p),l,r) );
if( r>=mid+1 ) ans = min( ans,query_mi(rs(p),l,r) );
return ans;
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(q--)
{
int op; cin>>op;
if( op==1 )
{
int x,y; cin>>x>>y;
update(1,x,y);
}
else
{
int l,r; cin>>l>>r;
int ans = query_mx(1,l,r)-query_mi(1,l,r) == r-l;
printf("%s
",ans?"YES":"NO");
}
}
return 0;
}