/*
in the name of god
*/
//#pragma GCC optimize("Ofast,O3,unroll-loops")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,avx,avx2,popcnt,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pii;
typedef pair<long long ,long long> pll;
typedef long long ll ;
#define File freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define all(V) V.begin(),V.end()
#define setprec(x) fixed << setprecision(x)
#define Mp(a,b) make_pair(a,b)
#define len(V) (int)(V.size())
#define sep ' '
#define endl '\n'
#define pb push_back
#define fi first
#define sec second
#define popcount(x) __builtin_popcount(x)
#define lid (u<<1)
#define rid ((lid)|1)
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll N = 2e5 + 10,SQ=320,LOG=31;
const ll inf = 1e17 , MD = 1e9 + 7;
inline ll md(ll x){ x %= MD; return (x < 0 ? x + MD : x);}
int n,q;
int L[N],R[N];
int dis[2][N<<2];
int val[N<<2];
int id[N];
int num = 0;
vector<pii> g[N<<2];
void build(int u=1,int l=1,int r=n+1){
num = max(num,u);
if(r-l==1){
id[l] = u;
return;
}
int mid = (l+r)>>1;
build(lid,l,mid);
build(rid,mid,r);
// cout << lid << " -> " << u << " " << 0 << endl;
// cout << rid << " -> " << u << " " << 0 << endl;
g[lid].pb({u,0});
g[rid].pb({u,0});
}
void Add(int s,int e,int x,int u=1,int l=1,int r=n+1){
if(e <= s || e <= l || r <= s) return;
if(s <= l && r <= e){
g[u].pb({id[x],1});
// cout << u << " -> " << id[x] << sep << 1 << endl;
return;
}
int mid = (l+r)>>1;
Add(s,e,x,lid,l,mid);
Add(s,e,x,rid,mid,r);
}
deque<int> Q;
void bfs(int j){
fill(dis[j],dis[j] + num + 2,inf);
for(auto h : Q) dis[j][h] =0;
while(!Q.empty()){
int u = Q.front();Q.pop_front();
for(auto h : g[u]){
if(h.sec == 0){
if(dis[j][h.fi] > dis[j][u]){
Q.push_front(h.fi);
dis[j][h.fi] = dis[j][u];
}
}
else {
if(dis[j][h.fi] > dis[j][u] + 1){
Q.pb(h.fi);
dis[j][h.fi] = dis[j][u] + 1;
}
}
}
}
}
priority_queue<pii,vector<pii>,greater<pii>> pq;
void dijk(){
for(int i =1 ;i <= num ;i++) pq.push({val[i],i});
while(!pq.empty()){
auto [d,u] = pq.top();pq.pop();
if(d != val[u]) continue;
for(auto h : g[u]){
if(val[h.fi] > val[u] + h.sec){
val[h.fi] = val[u] + h.sec;
pq.push({val[h.fi],h.fi});
}
}
}
}
int32_t main() {
ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0);
cin >> n ;
for(int i = 1;i <= n;i++) cin >> L[i] >> R[i];
build();
for(int i =1 ;i <= n;i++){
Add(L[i],R[i]+1,i);
}
Q.pb(id[n]);
bfs(0);
Q.pb(id[1]);
bfs(1);
for(int i =1 ;i <= num;i++) val[i] = dis[0][i] + dis[1][i];
dijk();
cin >> q;
for(int i =1 ;i <= q;i++){
int x;
cin >> x;
if(val[id[x]] > n+1) cout << -1 << endl;
else cout << val[id[x]] << endl;
}
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... |