Pagini recente » Diferente pentru documentatie intre reviziile 81 si 80 | Istoria paginii utilizator/laura22 | Istoria paginii utilizator/popahoreas | Profil AndreeaChitu | Cod sursa (job #943048)
Cod sursa(job #943048)
#include<fstream>
#include<vector>
using namespace std;
class stiv{
public:
int v, i;
stiv(){};
stiv(int v1, int i1){
v = v1;
i = i1;
}
};
vector<int> graph[280005];
int n, m, dp[19][280005];
vector<stiv> stack;
void dfs(){
stack.push_back(stiv(0, -1));
int wh;
while(!stack.empty()){
wh = stack.size() - 1;
++stack[wh].i;
if(stack[wh].i >= graph[stack[wh].v].size()){
stack.pop_back();
continue;
}
int y = graph[stack[wh].v][stack[wh].i];
for(int i = 0; i < 18; ++i){
int t = 1 << i;
if(t > stack.size())
break;
dp[i][y] = stack[stack.size() - t].v;
}
stack.push_back(stiv(y, -1));
}
}
int query(int &vert, int &anc){
for(int i = 0; i < 18; ++i)
if(anc & (1 << i))
vert = dp[i][vert];
return vert;
}
int main(){
ifstream in("stramosi.in");
ofstream out("stramosi.out");
in >> n >> m;
for(int i = 1; i <= n; ++i){
int x;
in >> x;
graph[x].push_back(i);
}
dfs();
int x, y;
for(int i = 1; i <= m; ++i){
in >> x >> y;
out << query(x, y) << "\n";
}
return 0;
}