比赛 2026.8.26 评测结果 AAAAAAAAWWWAAWWWWWWW
题目名称 interval 最终得分 50
用户昵称 123 运行时间 5.279 s
代码语言 C++ 内存使用 28.13 MiB
提交时间 2026-08-26 12:50:16
显示代码纯文本
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1e6+10,inf=1e9,K=22;
int n,q,a[N],b[N],c[N],tot=0,s[N][K],lg[N],ans[N],root;
vector<int> v;
unordered_map<int,int> mp;
struct node {
    int l,r,num;
} e[N];
struct tree {
    int ls,rs,mx;
} tr[N*8];
void solve1(int l,int r)
{
    v.clear(),mp.clear();
    for (int i=l;i<=r;i++)
    {
        if (!mp[b[i]]) v.pb(b[i]),mp[b[i]]=1;
    }
    sort(v.begin(),v.end());
    for (int i=l;i<=r;i++)
    {
        if (a[i]==b[i]) continue;
        int x=a[i],y=b[i]-1;
        int cnt1=lower_bound(v.begin(),v.end(),x)-v.begin(),cnt2=lower_bound(v.begin(),v.end(),y)-v.begin();
        if (v[cnt1]!=x || v[cnt2]!=y || cnt2-cnt1+1!=y-x+1)
        {
            cout<<"0 ";
            return ;
        }
    }
    cout<<"1 ";
}
int query(int p,int l,int r,int x)
{
    if (l==r) return l;
    int mid=l+r>>1;
//    cout<<l<<" "<<r<<endl;
    if (tr[tr[p].ls].mx<x) return query(tr[p].ls,l,mid,x);
    else return query(tr[p].rs,mid+1,r,x);
}
int find(int x,int y)
{
    int z=lg[y-x+1];
    return max(s[x][z],s[y-(1<<z)+1][z]);
}
int solve3(int l,int r)
{
    int mx=find(l,r);
//    cout<<l<<" "<<r<<" "<<query(1,1,inf,l)<<endl;
    return query(1,1,inf,l)>=mx;
}
void update(int &p,int l,int r,int x,int y)
{
//    cout<<l<<" "<<r<<" "<<x<<endl;
    if (!p) p=++tot;
    if (l==r)
    {
        tr[p].mx=y;
        return ;
    }
    int mid=l+r>>1;
    if (x<=mid) update(tr[p].ls,l,mid,x,y);
    if (mid<x) update(tr[p].rs,mid+1,r,x,y);
    tr[p].mx=min(tr[tr[p].ls].mx,tr[tr[p].rs].mx);
}
void init2()
{
    s[1][0]=b[1]-1;
    for (int i=2;i<=n;i++) lg[i]=lg[i>>1]+1,s[i][0]=b[i]-1;
    for (int j=1;j<=20;j++)
    {
        for (int i=1;i+(1<<j)-1<=n;i++) s[i][j]=max(s[i][j-1],s[i+(1<<(j-1))][j-1]); 
    }
} 
int cmp(node x,node y)
{
    return x.r<y.r;
}
void solve() {
    cin>>n>>q;
    for (int i=1;i<=n;i++) cin>>a[i]>>b[i];
    for (int i=1;i<=q;i++)
    {
        int l,r;
        cin>>l>>r;l++,r++;
        if (n<=2000) solve1(l,r);
        e[i]={l,r,i};
    }
    if (n<=2000) return ;
    init2();
    sort(e+1,e+q+1,cmp);
    int now=1;
    for (int i=1;i<=q;i++)
    {
        while (now<=e[i].r) update(root,1,inf,b[now],now),now++;
        ans[e[i].num]=solve3(e[i].l,e[i].r);
    }
    for (int i=1;i<=q;i++) cout<<ans[i]<<" ";
}
int main() {
    freopen("intervallavretni.in","r",stdin); 
    freopen("intervallavretni.out","w",stdout); 
    ios::sync_with_stdio(0),cin.tie(0);
    solve();
    return 0;
}