比赛 2026.8.26 评测结果 AAAAAAAAAAAAAWWWWWWW
题目名称 interval 最终得分 65
用户昵称 运行时间 3.508 s
代码语言 C++ 内存使用 63.16 MiB
提交时间 2026-08-26 12:45:13
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N=250010;

int n,q;
int a[N],b[N];

inline int read(){
    int t=0,f=1;
    register char c=getchar();
    while(c<'0'||c>'9') f=(c=='-')?(-1):(f),c=getchar();
    while(c>='0'&&c<='9') t=(t<<3)+(t<<1)+(c^48),c=getchar();
    return t*f;
}

struct Subtask1{
    int len;
    int li[N];
    
    void Solve(int l,int r){
        len=0;
        for(int i=l;i<=r;i++) li[++len]=b[i];
        sort(li+1,li+1+len);len=unique(li+1,li+1+len)-(li+1);
        bool flag=false;
        for(int i=l;i<=r;i++){
            int x=lower_bound(li+1,li+1+len,b[i])-li;
            if(x>(b[i]-a[i])&&li[x-(b[i]-a[i])]==a[i]);
            else{flag=true;break;}
        }
        cout<<(!flag)<<" ";
    }
    
    void solve(){
        while(q--){
            int l=read()+1,r=read()+1;
            Solve(l,r);
        }
    }
}Sub1;

struct Subtask2{
    struct Tree1{
        int tr[N];
        
        int lowbit(int x){return x&-x;}
        
        void update(int x,int y){
            while(x) tr[x]=max(tr[x],y),x-=lowbit(x);
        }
        
        int query(int x){
            int res=0;
            while(x<=n) res=max(res,tr[x]),x+=lowbit(x);
            return res;
        }
    }Tr1;
    
    struct Tree2{
        int tr[N];
        
        int lowbit(int x){return x&-x;}
        
        void update(int x){
            x++;
            while(x<=n) tr[x]++,x+=lowbit(x);
        }
        
        int query(int x){
            int res=0;
            while(x) res+=tr[x],x-=lowbit(x);
            return res;
        }
    }Tr2;
    
    int p[N],las[N];
    
    void init(){
        for(int i=1;i<=n;i++)
            if(b[i]<=n) las[i]=p[b[i]],p[b[i]]=i;
    }
    
    int L[N],R[N],ans[N],sum[N];
    
    vector<int> g[N];
    
    void solve(){
        init();
        for(int i=1;i<=q;i++){
            L[i]=read()+1,R[i]=read()+1;
            g[R[i]].push_back(i),g[L[i]-1].push_back(-i);
        }
        for(int i=1;i<=n;i++){
            Tr1.update(i,b[i]),Tr2.update(las[i]);
            //无垠中 谁来拯救
            //漂泊的体征 只剩这躯壳
            for(int j:g[i]){
                if(j<0){sum[-j]-=Tr2.query(L[-j]);continue;}
                int max1=Tr1.query(L[j]);sum[j]+=Tr2.query(L[j]);
//                cout<<"Max1:"<<max1<<" Max2:"<<sum[j]<<"\n";
                if(max1==sum[j]) ans[j]=1;
            } 
        }
        for(int i=1;i<=q;i++) cout<<ans[i]<<" ";cout<<"\n";
    }
}Sub2;

struct Subtask3{
    int sum[N][102],sumq[N][102];
    int L[N],R[N],ans[N];
    
    vector<int> g[N];
    
    void solve(){
        for(int i=1;i<=q;i++){
            L[i]=read()+1,R[i]=read()+1;
            g[R[i]].push_back(i);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=100;j++) sum[i][j]=sum[i-1][j],sumq[i][j]=sumq[i-1][j];
            sum[i][b[i]]++;
            for(int j=a[i];j<=b[i];j++) sumq[i][j]++;
            for(int j:g[i]){
                for(int k=1;k<=100;k++){
                    if((sumq[R[j]][k]-sumq[L[j]-1][k])&&!(sum[R[j]][k]-sum[L[j]-1][k])){
                        ans[j]=1;break;
                    }
                }
            }
        }
        for(int i=1;i<=q;i++) cout<<!ans[i]<<" ";cout<<"\n";
    }
}Sub3;

signed main(){
    freopen("intervallavretni.in","r",stdin);
    freopen("intervallavretni.out","w",stdout);
    n=read(),q=read();
    for(int i=1;i<=n;i++) a[i]=read(),b[i]=read();
    bool flag=false,flag1=false;
    for(int i=1;i<=n;i++) if(a[i]!=1) flag=true;
    for(int i=1;i<=n;i++) if(b[i]>100) flag1=true;
    if(n<=2000&&q<=2000) Sub1.solve();
    else if(!flag1) Sub3.solve();
    else Sub2.solve();
//    Sub3.solve();
    return 0;
}