此题关键:任何时候这n个数字均互不相同!!!
所以就可以直接上线段树,放心大胆的维护一个最大值,最小值,询问时直接判断maxx-minn是否等于r-l即可

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int INF=0x7fffffff,mod=998244353,P=29;
int read()
{
   int s=0,bj=0;
   char ch=getchar();
   while(ch<'0'||ch>'9')bj|=(ch=='-'),ch=getchar();
   while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
   return bj?-s:s;
}
void printnum(int x)
{
    if(x>9)printnum(x/10);
    putchar(x%10^48);
}
void print(int x,char ch)
{
    if(x<0){putchar('-');x=-x;}
    printnum(x);putchar(ch);
}
int n,m;
int a[100005];
struct node{int l,r,maxx,minn;}tree[400005];
void pushup(int k)
{
    tree[k].maxx=max(tree[k<<1].maxx,tree[k<<1|1].maxx);
    tree[k].minn=min(tree[k<<1].minn,tree[k<<1|1].minn);
}
void Build(int k,int l,int r)
{
    tree[k].l=l;tree[k].r=r;
    if(l==r){tree[k].maxx=tree[k].minn=a[l];return;}
    int mid=(l+r)>>1;
    Build(k<<1,l,mid);Build(k<<1|1,mid+1,r);pushup(k);
}
void Modify(int k,int x,int d)
{
    if(tree[k].l==tree[k].r){tree[k].maxx=tree[k].minn=d;return;}
    int mid=(tree[k].l+tree[k].r)>>1;
    if(x<=mid)Modify(k<<1,x,d);
    else Modify(k<<1|1,x,d);
    pushup(k);
}
int Ask_maxx(int k,int l,int r)
{
    int maxx=0;
    if(l<=tree[k].l&&r>=tree[k].r)return tree[k].maxx;
    int mid=(tree[k].l+tree[k].r)>>1;
    if(l<=mid)maxx=max(maxx,Ask_maxx(k<<1,l,r));
    if(r>mid)maxx=max(maxx,Ask_maxx(k<<1|1,l,r));
    return maxx;
}
int Ask_minn(int k,int l,int r)
{
    int minn=INF;
    if(l<=tree[k].l&&r>=tree[k].r)return tree[k].minn;
    int mid=(tree[k].l+tree[k].r)>>1;
    if(l<=mid)minn=min(minn,Ask_minn(k<<1,l,r));
    if(r>mid)minn=min(minn,Ask_minn(k<<1|1,l,r));
    return minn;
}
signed main()
{
    n=read();m=read();
    for(int i=1;i<=n;++i)a[i]=read();
    Build(1,1,n);
    int opt,x,y;
    for(int i=1;i<=m;++i)
    {
        opt=read();x=read();y=read();
        if(opt==1)Modify(1,x,y);
        else 
        {
            int maxx=Ask_maxx(1,x,y),minn=Ask_minn(1,x,y);
            if(maxx-minn==y-x)puts("YES");
            else puts("NO"); 
        }
    }
    return 0;
}

此外,如果这道题没有保证互不相同怎么办呢?(我考场上没看到互不相同写了半天毒瘤了T_T),可以通过维护max,min和(p为一个质数),通过等比数列求和公式算出他应该的值,若两个不同,就说明不是连续的
核心代码:

            if(maxx-minn+1==y-x+1&&(Qpow(P,maxx-minn+1)-1)*getInv(P-1,mod)%mod*Qpow(P,minn)%mod==num1)puts("YES");
//在模意义下的除法可以转换为乘上他的逆元
            else puts("NO");