/* Author : Mychecksdead */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 2e5+100, M = 1e5+10, K = 22, MX = 30;
int n, L[N], R[N], q, rmq[N][K][2], up[N][K][2];
vector<int> S[N*4];
vi dist(N, MOD);
void add(int l, int r, int ql, int qr, int k, int idx){
if(ql > r || l > qr) return;
if(ql <= l && r <= qr){
S[k].pb(idx);
return;
}
int m = l+r>>1;
add(l, m, ql, qr, k<<1, idx);
add(m+1, r, ql, qr, k<<1|1, idx);
}
vi TO;
void rem(int l, int r, int p, int k){
for(auto c: S[k]){
if(dist[c] > dist[p] + 1){
dist[c] = dist[p] + 1;
TO.pb(c);
}
}
S[k].clear();
if(l == r){
return;
}
int m = l + r >> 1;
if(p <= m){
rem(l, m, p, k<<1);
}else{
rem(m+1, r, p, k<<1|1);
}
}
int get(int l, int r){
int k = int(log2(r-l+1));
return R[rmq[l][k][0]] > R[rmq[r-(1<<k)+1][k][0]] ? rmq[l][k][0] : rmq[r-(1<<k)+1][k][0];
}
int get2(int l, int r){
int k = int(log2(r-l+1));
return L[rmq[l][k][1]] < L[rmq[r-(1<<k)+1][k][1]] ? rmq[l][k][1] : rmq[r-(1<<k)+1][k][1];
}
void solve(){
cin >> n;
vector<pii> v;
for(int i = 1; i <= n; ++i){
cin >> L[i] >> R[i];
rmq[i][0][0] = i;
rmq[i][0][1] = i;
}
for(int j = 1; j < K; ++j){
for(int i = 1; i + (1<<j) <= n+1; ++i){
rmq[i][j][0] = R[rmq[i][j-1][0]] > R[rmq[i+(1<<(j-1))][j-1][0]] ? rmq[i][j-1][0] : rmq[i+(1<<(j-1))][j-1][0];
rmq[i][j][1] = L[rmq[i][j-1][1]] < L[rmq[i+(1<<(j-1))][j-1][1]] ? rmq[i][j-1][1] : rmq[i+(1<<(j-1))][j-1][1];
}
}
for(int i = 1; i <= n; ++i){
up[i][0][0] = get(L[i], R[i]);
up[i][0][1] = get2(L[i], R[i]);
}
for(int j = 1; j < K; ++j){
for(int i = 1; i <= n; ++i){
up[i][j][0] = up[up[i][j - 1][0]][j - 1][0];
up[i][j][1] = up[up[i][j - 1][1]][j - 1][1];
}
}
vi go(n + 1);
for(int i = 1; i <= n; ++i){
go[i] = 1;
bool bad = 0;
int v = i;
for(int j = K-1; j >= 0; --j){
if(R[up[v][j][0]] < n){
v = up[v][j][0];
go[i] += (1<<j);
}
}
if(R[v] == n) go[i] += 0;
else go[i]++;
if(R[up[v][0][0]] < n) bad = 1;
v = i;
for(int j = K-1; j >= 0; --j){
if(L[up[v][j][1]] > 1){
v = up[v][j][1];
go[i] += (1<<j);
}
}
if(L[v] == 1) go[i] += 0;
else go[i]++;
if(L[up[v][0][1]] > 1) bad = 1;
if(bad) go[i] = MOD;
}
priority_queue<pair<ll, int>> Q;
vector<bool> vis(n + 1);
for(int i = 1; i <= n; ++i){
add(1, n, L[i], R[i], 1, i);
dist[i] = go[i];
Q.push({-dist[i], i});
}
while(!Q.empty()){
int v = Q.top().ss; Q.pop();
if(vis[v]) continue;
vis[v] = 1;
rem(1, n, v, 1);
for(int x: TO){
Q.push({-dist[x], x});
}
TO.clear();
}
// en;
cin >> q;
for(int i = 1; i <= q; ++i){
int v; cin >> v;
cout << (dist[v] > n ? -1 : dist[v]) << '\n';
}
}
int main(){
cin.tie(0); ios::sync_with_stdio(0);
int tt = 1, aa;
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
while(tt--){
solve();
en;
}
cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |