Submission #1235986

#TimeUsernameProblemLanguageResultExecution timeMemory
1235986hamanp87Railway Trip 2 (JOI22_ho_t4)C++17
100 / 100
293 ms227248 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;

//#pragma GCC optimize("03,unroll-loops")
//#pragma GCC target("avx2")
//#pragma GCC target("sse4")

#define all(v) v.begin(),v.end()
#define F first
#define S second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
//#define randi uniform_int_distribution<long long>
#define damoon(v) v.resize(unique(all(v))-v.begin())
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//randi dist(0,10000000000000000);

typedef pair<int,int> pii;
typedef pair<long long,long long> pll;
typedef pair<int,bool> pib;
typedef pair<long long,bool> plb;
typedef pair<int,pii> pip;
typedef pair<pii,int> ppi;
typedef vector<int> veci;
typedef vector<long long> vecl;
typedef vector<bool> vecb;
typedef vector<pii> vecp;
typedef set<int> seti;
typedef set<long long> setl;
typedef set<pii> setp;
typedef map<int,int> mapii;
typedef map<long long,long long> mapll;
typedef map<int,bool> mapib;
typedef map<long long,bool> maplb;

const int inf=1e9,mod=1e9+7,neginf=-1e9,N=1e5+5,LG=17;
const double PI=acos(-1);
int n,K,m,lg2[N],spmn[LG][LG][N],spmx[LG][LG][N];

void initialize(int k)
{
    for(int j=1;j<LG;j++)
    {
        int tmp=1<<j;
        for(int i=1;i+tmp-1<=n;i++)
        {
            spmn[k][j][i]=min(spmn[k][j-1][i],spmn[k][j-1][i+(tmp>>1)]);
            spmx[k][j][i]=max(spmx[k][j-1][i],spmx[k][j-1][i+(tmp>>1)]);
        }
    }
}

inline int RMQn(int k,int l,int r)
{
    int j=lg2[r-l+1];
    return min(spmn[k][j][l],spmn[k][j][r-(1<<j)+1]);
}

inline int RMQx(int k,int l,int r)
{
    int j=lg2[r-l+1];
    return max(spmx[k][j][l],spmx[k][j][r-(1<<j)+1]);
}

void solve()
{
    cin>>n>>K>>m;
    lg2[1]=0;
    for(int i=2;i<N;i++)
        lg2[i]=lg2[i>>1]+1;

    vector<veci> fow(N),baw(N);
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        if(a<b)
        {
            fow[a].pub(b);
            fow[min(a+K,b)].pub(-b);
        }
        else
        {
            baw[a].pub(b);
            baw[max(a-K,b)].pub(-b);
        }
    }

    {
        multiset<int> ss;
        for(int i=1;i<=n;i++)
        {
            for(int x:fow[i])
            {
                if(x>0)
                    ss.insert(x);
                else
                    ss.erase(ss.find(-x));
            }
            if(ss.empty())
            {
                spmn[0][0][i]=spmx[0][0][i]=i;
            }
            else
            {
                spmn[0][0][i]=i;
                spmx[0][0][i]=*ss.rbegin();
            }
        }
    }

    {
        multiset<int> ss;
        for(int i=n;i>=1;i--)
        {
            for(int x:baw[i])
            {
                if(x>0)
                    ss.insert(x);
                else
                    ss.erase(ss.find(-x));
            }
            if(ss.size())
            {
                spmn[0][0][i]=min(spmn[0][0][i],*ss.begin());
                spmx[0][0][i]=max(spmx[0][0][i],i);
            }
        }
    }

    initialize(0);

    for(int k=1;k<LG;k++)
    {
        for(int i=1;i<=n;i++)
        {
            int l1=RMQn(k-1,i,i);
            int r1=RMQx(k-1,i,i);
            int l2=RMQn(k-1,l1,r1);
            int r2=RMQx(k-1,l1,r1);

            spmn[k][0][i]=l2;
            spmx[k][0][i]=r2;
        }
        initialize(k);
    }

    int q;
    cin>>q;
    while(q--)
    {
        int a,b;
        cin>>a>>b;

        if(a==b)
        {
            cout<<"0\n";
            continue;
        }

        int ans=0,cl=a,cr=a;

        for(int k=LG-1;k>=0;k--)
        {
            int nl=RMQn(k,cl,cr);
            int nr=RMQx(k,cl,cr);

            if(b<nl or b>nr)
            {
                ans+=(1<<k);
                cl=nl;
                cr=nr;
            }
        }

        int nl=RMQn(0,cl,cr);
        int nr=RMQx(0,cl,cr);

        if(b>=nl and b<=nr)
            cout<<ans+1<<"\n";
        else
            cout<<"-1\n";
    }
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);

    //ifstream fin("in.txt");
    //ofstream fout("out.txt");

    int t=1;
    //cin>>t;
    while(t--)
    {
        solve();
    }
}

#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...