Mai intai trebuie sa te autentifici.
Cod sursa(job #1673106)
Utilizator | Data | 3 aprilie 2016 14:26:35 | |
---|---|---|---|
Problema | Stramosi | Scor | 90 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.84 kb |
#include <iostream>
#include <fstream>
#include <stack>
#include <bitset>
#include <vector>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int NMAX = 250001;
int H[NMAX];
stack<int> st;
bitset<NMAX>mark;
int sp[NMAX][20];
vector<int> muchii[NMAX];
int n,m;
int height;
int lg[NMAX];
void citire()
{
in>>n>>m;
int x;
for(int i=1;i<=n;i++)
{
in>>x;
if(x)
{
sp[i][0] = x;
muchii[x].push_back(i);
}
}
}
void dfs(int x)
{
mark.set(x);
st.push(x);
int y,ok,target;
while(!st.empty())
{
y = st.top();
ok = 0;
for(unsigned int i=0;i<muchii[y].size();i++)
if(!mark.test(muchii[y][i]))
{
ok = 1;
target = muchii[y][i];
break;
}
if(ok)
{
H[target] = H[y] + 1;
if(height < H[target])
height = H[target];
st.push(target);
mark.set(target);
}
else
st.pop();
}
}
void sparse_table()
{
for(int i=2;i<=height;i++)
lg[i] = lg[i/2] + 1;
for(int j=1;(1<<j)<=height;j++)
for(int i=1;i<=n;i++)
if((1<<j)<=H[i])
sp[i][j] = sp[sp[i][j-1]][j-1];
}
int main()
{
citire();
for(int i=1;i<=n;i++)
if(!sp[i][0])
dfs(i);
sparse_table();
int x,y,k;
for(int i=1;i<=m;i++)
{
in>>x>>y;
if(y > H[x])
out<<0<<"\n";
else
{
while(y)
{
k = lg[y];
x = sp[x][k];
y-=(1<<k);
}
out<<x<<"\n";
}
}
in.close();
out.close();
return 0;
}