# 【CSES】1687. Company Queries I ## [題目連結](https://cses.fi/problemset/task/1687) ## **時間複雜度** * $O(N)$ ## **解題想法** 這題想考的是 LCA 預處理中倍數法的部分,主要是練習建倍數表跟查祖先 ## **完整程式** ```cpp= /* Question : CSES 1687. Company Queries I */ #include<bits/stdc++.h> using namespace std; #define opt ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define pirq(type) priority_queue<type, vector<type>, greater<type>> #define mem(x, value) memset(x, value, sizeof(x)); #define pii pair<int, int> #define pdd pair<double, double> #define pb push_back #define f first #define s second #define int long long const auto dir = vector< pair<int, int> > { {1, 0}, {0, 1}, {-1, 0}, {0, -1} }; const int MAXN = 2e5 + 50; const int Mod = 1e9 + 7; int n, q, p, v, k, fa[MAXN][20]; signed main(){ opt; cin >> n >> q; for( int i = 2 ; i <= n ; i++ ) cin >> fa[i][0]; for( int i = 1 ; i <= 20 ; i++ ){ for( int j = 1 ; j <= n ; j++ ){ fa[j][i] = fa[ fa[j][i-1] ][i-1]; } } while( q-- ){ cin >> v >> k; for (int i = 0 ; i < 20 ; i++){ if ( k & ( 1 << i ) ) v = fa[v][i]; } if ( !v ) cout << -1 << "\n"; else cout << v << "\n"; } } ```