Submission #784647

#TimeUsernameProblemLanguageResultExecution timeMemory
784647MohamedAliSaidanePassport (JOI23_passport)C++14
22 / 100
91 ms74188 KiB
#include <bits/stdc++.h>

using namespace std;

typedef vector<int> vi;

typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;

#define ff first
#define ss second
#define pb push_back
#define all(x) (x).begin(),(x).end()

const int nax = 2e5 + 4;
int n, q;
vi L, R, X;
int  LG[nax];
int sp[nax][20], ps[nax][20];

int comp1(int i, int j)
{
    if(R[i] == R[j])
    {
        if(L[i] < L[j])
            return i;
        else
            return j;
    }
    else if(R[i] > R[j])
        return i;
    else
        return j;
}
int comp2(int i, int j)
{
    if(L[i] == L[j])
    {
        if(R[i] > R[j])
            return i;
        else
            return j;
    }
    else if(L[i] < L[j])
        return i;
    else
        return j;
}
void build()
{
    for(int i =0 ; i < n;i++)
        sp[i][0] = i;
    for(int i = 0; i < n; i++)
        ps[i][0] = i;
    //cout << "here" << endl;
    for(int j = 1; j < 20; j++)
    {
        //cout << j << endl;
        for(int i = 0; i + (1 << (j - 1)) < n;i ++)
        {
            sp[i][j] = comp1(sp[i][j - 1], sp[i + (1 << (j - 1))][j - 1]);
            ps[i][j] = comp2(ps[i][j - 1], ps[i + (1 << (j - 1))][j - 1]);
        }
    }
}
int RMQ(int l, int r)
{
    int j = LG[r - l + 1];
    return comp1(sp[l][j], sp[r- (1 << j) + 1][j]);
}
int rmq(int l, int r)
{
    int j = LG[r - l + 1];
    return comp2(ps[l][j], ps[r - (1 << j) + 1][j]);
}
int dp[2505][2505];
int f(int l, int r)
{
    if(dp[l][r] != -1)
        return dp[l][r];
    if(l == 0 && r == n - 1)
        return dp[l][r] = 0;
    int ans = n + 2;
    int a = RMQ(l, r);
    int b = rmq(l, r);
    int la = min(l, L[a]), ra = max(r, R[a]);
    int lb = min(l, L[b]), rb = max(r, R[b]);
    if(la < l || ra > r)
        ans = min(ans, f(la, ra) + 1);
    if(lb < l || rb > r)
        ans = min(ans, f(lb, rb) + 1);
    return dp[l][r] = ans;
}
void solve()
{
    cin >> n;
    memset(dp, -1, sizeof(dp));
    L.resize(n); R.resize(n);
    for(int i =0; i < n; i++)
    {
        cin >> L[i] >> R[i];
        L[i]--; R[i]--;
    }

    build();
    //cout << "here" << endl;
    cin >> q;
    while(q--)
    {
        int X; cin >> X;
        X--;
        int l = L[X], r = R[X];
        int ans = f(l, r) + 1;
        if(ans >= n + 1)
            cout << "-1\n";
        else
            cout << ans << '\n';
    }
}

int32_t main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    LG[1] = 0;
    for(int i =2; i < nax; i++)
        LG[i] = LG[i/2] + 1;
    int tt = 1;
    while(tt--)
        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...