WA on #5 #6 #17 #18 #29 #41 #42
#include<bits/stdc++.h>
using namespace std;
int n,q,fa[100005],son[100005],mp[100005],cnt[100005];
vector<int> bridge[100005],Q[100005];
void dfs(int now)
{
if(!son[now])
{
mp[now] = now;
return;
}
for(int to:bridge[now]) dfs(to);
mp[now] = mp[son[now]];
return;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin >> n >> q;
for(int i(2);i <= n;++i)
{
cin >> fa[i];
if(!son[fa[i]]) son[fa[i]] = i;
bridge[fa[i]].emplace_back(i);
}
dfs(1);
for(int i(1);i <= n;++i) ++cnt[mp[i]];
for(int i(1);i <= n;++i)
{
if(!son[i] && cnt[i] > 1)
{
for(int now(i);now;now = fa[now]) Q[i].emplace_back(now);
reverse(Q[i].begin(),Q[i].end());
}
}
Q[0].emplace_back(1);
for(int s,k,a,now;q;--q)
{
cin >> s >> k;
bool flag(0);
if(cnt[mp[s]] == 1)
{
flag = 1;
for(;k;--k)
{
cin >> a;
if(a > 0)
{
s = fa[s];
--a;
now = lower_bound(Q[mp[s]].begin(),Q[mp[s]].end(),s)-Q[mp[s]].begin();
now += -a;
now = min(now,int(Q[mp[s]].size())-1);
now = max(now,0);
s = Q[mp[s]][now];
--k;
flag = 0;
break;
}
}
}
else now = lower_bound(Q[mp[s]].begin(),Q[mp[s]].end(),s)-Q[mp[s]].begin();
if(flag)
{
cout << s << "\n";
continue;
}
for(;k;--k)
{
cin >> a;
now += -a;
now = min(now,int(Q[mp[s]].size())-1);
now = max(now,0);
s = Q[mp[s]][now];
}
cout << s << "\n";
}
}