Submission #1322721

#TimeUsernameProblemLanguageResultExecution timeMemory
1322721simona1230Event Hopping (BOI22_events)C++20
20 / 100
252 ms17384 KiB
#include<bits/stdc++.h>
using namespace std;

struct help
{
    int l,r,i;
    help(){}
    help(int _l,int _r,int _i)
    {
        l=_l;
        r=_r;
        i=_i;
    }
};

int n,q;
help a[100001],b[100001];

void read()
{
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].l>>a[i].r;
        a[i].i=i;
    }

    for(int i=1;i<=q;i++)
    {
        cin>>b[i].l>>b[i].r;
        b[i].i=i;
    }
}

bool cmpr(help h1,help h2)
{
    return h1.r<h2.r;
}

int t[400001];

void build(int i,int l,int r)
{
    if(l==r)
    {
        t[i]=l;
        return;
    }

    int m=(l+r)/2;
    build(i*2,l,m);
    build(i*2+1,m+1,r);

    if(a[t[2*i]].l<a[t[2*i+1]].l)t[i]=t[2*i];
    else t[i]=t[2*i+1];
    //cout<<l<<" "<<r<<" "<<t[i]<<endl;
}

int query(int i,int l,int r,int ql,int qr)
{
    if(ql>qr)return 0;
    if(ql<=l&&r<=qr)return t[i];
    
    int m=(l+r)/2;
    int q1=query(i*2,l,m,ql,min(qr,m));
    int q2=query(i*2+1,m+1,r,max(m+1,ql),qr);
    
    if(q1==0)return q2;
    if(q2==0)return q1;
    
    if(a[q1].l<a[q2].l)return q1;
    return q2;
}

int g[200001][32];
int p[200001],id[200001];

void prec()
{
    sort(a+1,a+n+1,cmpr);
    build(1,1,n);
    for(int i=1;i<=n;i++)
    {
        //cout<<"!! "<<a[i].l<<" "<<a[i].r<<endl;
        int h=i;
        int l=1,r=i-1;
        while(l<=r)
        {
            int m=(l+r)/2;
            if(a[m].r>=a[i].l)
            {
                h=m;
                r=m-1;
            }
            else l=m+1;
        }

        h=query(1,1,n,h,i);
        g[a[i].i][0]=a[h].i;
        //cout<<a[i].i<<" > "<<a[h].i<<endl;
    }

    for(int j=1;j<=20;j++)
    {
        for(int i=1;i<=n;i++)
        {
            g[i][j]=g[g[i][j-1]][j-1];
            //cout<<i<<" "<<j<<" "<<g[i][j]<<endl;
        }
    }
}

bool cmp(help h1,help h2)
{
    return h1.i<h2.i;
}

void solve()
{
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=q;i++)
    {
        int x=b[i].l,y=b[i].r;
        if(x==y)
        {
            cout<<0<<endl;
            continue;
        }

        int cnt=0;
        if(a[y].l<=a[x].r&&a[x].r<=a[y].r)
        {
            cout<<1<<endl;
            continue;
        }

        for(int j=20;j>=0;j--)
        {
            if(a[x].l<a[g[y][j]].l)
            {
                y=g[y][j];
                cnt+=(1<<j);
            }
        }

        if(a[y].l>a[x].l&&a[g[y][0]].l<=a[x].l)cout<<cnt+1<<endl;
        else cout<<"impossible"<<endl;
    }
}



int main()
{
    read();
    prec();
    solve();
    return 0;
}
/*
6
5
8 9
5 8
9 12
1 3
2 3
10 13
1 3
2 5
1 6
4 5
3 4

4 3
1 5
2 7
3 9
8 10
1 2
1 3
1 4

6 1
5 8
10 12
14 16
3 6
1 4
11 15

4 4
1 4
2 8
5 6
7 10


1 2
2 3
3 2
1 4
6 4
1 5
2 8
5 6
7 10
9 10
12 13
1 6
1 3
3 1
2 5


*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...