Pagini recente » Cod sursa (job #939250) | Cod sursa (job #469325) | Cod sursa (job #3219270) | Cod sursa (job #1986505) | Cod sursa (job #1850672)
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMax 300000
#define x first
#define y second
using namespace std;
typedef pair<int, int> abc;
vector<int> a[NMax+1];
vector<abc> q[NMax+1];
int stiva[NMax+1];
int deja[NMax+1];
int res[NMax+1];
int idx[NMax+1];
int v[NMax+1];
int nr;
void DFS(int k)
{
int t,ok;
abc r;
stiva[++nr] = k;
while(nr)
{
ok = 0;
t = stiva[nr];
if( !deja[t] )
{
for(int i = 0; i < q[t].size(); ++i)
{
r = q[t][i];
if(nr <= r.x) res[r.y] = 0;
else res[r.y] = stiva[nr-r.x];
}
deja[t] = 1;
}
if(idx[t] < a[t].size() ) { stiva[++nr] = a[t][ idx[t]++ ]; ok = 1; }
if(!ok) --nr;
}
}
int main(){
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
int i,N,M,x,y;
scanf("%d %d",&N,&M);
for(i = 1; i <= N; ++i)
{
scanf("%d",&x);
a[x].push_back(i);
v[i] = x;
}
for(i = 1; i <= M; ++i)
{
scanf("%d %d",&x,&y);
q[x].push_back({y,i});
}
for(i = 1; i <= N; ++i)
if( !v[i] ) DFS(i);
for(i = 1; i <= M; ++i) printf("%d\n", res[i]);
return 0;
}