#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
const int maxn=2e5;
int n,l[maxn+2],r[maxn+2];
bool vis[maxn+2];
struct seg{
int l,r;
seg *lf,*rg;
vector<int>isi;
void reset(){
isi.clear();
if(l==r)return;
lf->reset(),rg->reset();
}
void build(int x,int y){
l=x,r=y;
if(l==r)return;
int mid=(l+r)/2;
lf=new seg(),rg=new seg();
lf->build(l,mid),rg->build(mid+1,r);
}
void update(int posl,int posr,int apa){
if(l>posr || r<posl)return;
if(l>=posl && r<=posr){
isi.pb(apa);
return;
}
lf->update(posl,posr,apa); rg->update(posl,posr,apa);
}
vector<int> query(int pos){
vector<int>baru;
for(auto y : isi){
if(vis[y])continue;
baru.pb(y);
vis[y]=true;
}
isi.clear();
if(l==r)return baru;
int mid=(l+r)/2;
vector<int>a;
if(pos<=mid)a=lf->query(pos);
else a=rg->query(pos);
for(auto y : a){
baru.pb(y);
}
return baru;
}
};
int dist[maxn+2][3];
seg cek;
void solve(int ty){
cek.reset();
for(int q=1;q<=n;++q){
dist[q][ty]=1e18;
vis[q]=false;
}
queue<int>qu;
if(ty==0){
qu.push(1);
vis[1]=true;
dist[1][0]=0;
}
else{
qu.push(n);
vis[n]=true;
dist[n][1]=0;
}
for(int q=1;q<=n;q++){
cek.update(l[q],r[q],q);
}
while(qu.size()){
int idx=qu.front(); qu.pop();
vector<int>nxt=cek.query(idx);
for(auto x : nxt){
if(dist[x][ty]>dist[idx][ty]+1){
dist[x][ty]=dist[idx][ty]+1;
qu.push(x);
vis[x]=true;
}
}
}
}
signed main(){
cin>>n;
for(int q=1;q<=n;q++){
cin>>l[q]>>r[q];
}
cek.build(1,n);
solve(0),solve(1);
priority_queue<ii,vector<ii>,greater<ii> >pq;
for(int q=1;q<=n;q++){
if(q==1){
dist[q][2]=dist[q][1];
}
else if(q==n){
dist[q][2]=dist[q][0];
}
else{
dist[q][2]=dist[q][0]+dist[q][1]-1;
}
if(dist[q][2]<1e18){
pq.push({dist[q][2],q});
}
}
// for(int q=1;q<=n;q++){
// cout<<dist[q][0]<<" k "<<dist[q][1]<<endl;
// }
cek.reset();
for(int q=1;q<=n;q++)vis[q]=false;
for(int q=1;q<=n;q++)cek.update(l[q],r[q],q);
while(pq.size()){
auto [jrk,idx]=pq.top(); pq.pop();
if(dist[idx][2]!=jrk)continue;
vector<int>nxt=cek.query(idx);
for(auto x : nxt){
if(dist[x][2]>jrk+1){
dist[x][2]=jrk+1;
pq.push({dist[x][2],x});
}
}
}
int hmm; cin>>hmm;
while(hmm--){
int idx; cin>>idx;
if(dist[idx][2]>=1e18){
cout<<-1<<endl;
}
else{
cout<<dist[idx][2]<<endl;
}
}
}
| # | 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... |