1 solutions
-
0
C++ :
#include<bits/stdc++.h> #define int long long #define double long double #define bug cout<<"___sgge888___"<<'\n'; using namespace std; int n,m; int f[100005][20]; int s[100005][20]; vector<int>g[100005]; int dep[100005]; void dfs(int u,int fa){ dep[u]=dep[fa]+1; f[u][0]=fa; if(!g[u].empty()){ s[u][0]=g[u][0]; } else{ s[u][0]=u; } for(auto v:g[u]){ dfs(v,u); } } void init(){ for(int j=1;j<20;j++){ for(int i=1;i<=n;i++){ if(f[i][j-1]!=0){ f[i][j]=f[f[i][j-1]][j-1]; } } } for(int j=1;j<20;j++){ for(int i=1;i<=n;i++){ s[i][j]=s[s[i][j-1]][j-1]; } } } int up(int u,int k){ if(u==1){ return 1; } int dis=dep[u]-1; if(k>=dis){ return 1; } for(int i=0;i<20;i++){ if((k>>i)&1){ u=f[u][i]; } } return u; } int down(int u,int k){ for(int i=0;i<20;i++){ if((k>>i)&1){ u=s[u][i]; } } return u; } signed main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=0;j<20;j++){ s[i][j]=i; } } f[1][0]=0; for(int i=2;i<=n;i++){ int p; cin>>p; f[i][0]=p; g[p].push_back(i); } for(int i=1;i<=n;i++){ sort(g[i].begin(),g[i].end()); } dfs(1,0); init(); for(int i=1;i<=m;i++){ int u,k; cin>>u>>k; int ans=u; for(int j=1;j<=k;j++){ int x; cin>>x; if(x>0){ ans=up(ans,x); } else{ x=-x; ans=down(ans,x); } } cout<<ans<<'\n'; } return 0; }
- 1
Information
- ID
- 140
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By