Advertisement
7oSkaaa

C

Feb 24th, 2023
577
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define fixed(n) fixed << setprecision(n)
  6. #define ceil(n, m) (((n) + (m) - 1) / (m))
  7. #define add_mod(a, b, m) (((a % m) + (b % m)) % m)
  8. #define sub_mod(a, b, m) (((a % m) - (b % m) + m) % m)
  9. #define mul_mod(a, b, m) (((a % m) * (b % m)) % m)
  10. #define all(vec) vec.begin(), vec.end()
  11. #define rall(vec) vec.rbegin(), vec.rend()
  12. #define sz(x) int(x.size())
  13. #define debug(x) cout << #x << ": " << (x) << "\n";
  14. #define fi first
  15. #define se second
  16. #define ll long long
  17. #define ull unsigned long long
  18. #define EPS 1e-9
  19. constexpr int INF = 1 << 30, Mod = 1e9 + 7;
  20. constexpr ll LINF = 1LL << 62;
  21. #define PI acos(-1)
  22. template < typename T = int > using Pair = pair < T, T >;
  23. vector < string > RET = {"NO", "YES"};
  24.  
  25. template < typename T = int > istream& operator >> (istream &in, vector < T > &v) {
  26.     for (auto &x : v) in >> x;
  27.     return in;
  28. }
  29.  
  30. template < typename T = int > ostream& operator << (ostream &out, const vector < T > &v) {
  31.     for (const T &x : v) out << x << ' ';
  32.     return out;
  33. }
  34.  
  35. template < typename T = int > struct LCA {
  36.    
  37.     struct Edge {
  38.  
  39.         ll v, w;
  40.  
  41.         Edge(ll V = 0, ll W = 0) : v(V), w(W) {}
  42.  
  43.         bool operator < (const Edge &rhs) const {
  44.             return w < rhs.w;
  45.         }
  46.  
  47.     };
  48.  
  49.     int N, LOG;
  50.     vector < vector < T > > anc;
  51.     vector < vector < T > > adj;
  52.     vector < T > dep, val;
  53.    
  54.     LCA(int n, const vector < vector < T > >& G, const vector < T >& W){
  55.         N = n + 10, LOG = 0;
  56.         while((1 << LOG) <= n) LOG++;
  57.         dep = vector < T > (N);
  58.         anc = vector < vector < T > > (N, vector < T > (LOG));
  59.         val = W, adj = G;
  60.     }
  61.  
  62.     T operation(T a, T b){
  63.         return (a & b);
  64.     }
  65.    
  66.     void dfs(int u, int p = 0){
  67.         for(auto& v : adj[u]){
  68.             if(v == p) continue;
  69.             dep[v] = dep[u] + 1, anc[v][0] = u;
  70.             for(int bit = 1; bit < LOG; bit++)
  71.                 anc[v][bit] = anc[anc[v][bit - 1]][bit - 1];
  72.             dfs(v, u);
  73.         }
  74.     }
  75.    
  76.     int kth_ancestor(int u, int k){
  77.         if(dep[u] < k)
  78.             return -1;
  79.         for(int bit = LOG - 1; bit >= 0; bit--)
  80.             if(k & (1 << bit))
  81.                 u = anc[u][bit];
  82.         return u;
  83.     }
  84.    
  85.     int get_lca(int u, int v){
  86.         if(dep[u] < dep[v])
  87.             swap(u, v);
  88.         u = kth_ancestor(u, dep[u] - dep[v]);
  89.         if(u == v)
  90.             return u;
  91.         for(int bit = LOG - 1; bit >= 0; bit--)
  92.             if(anc[u][bit] != anc[v][bit])
  93.                 u = anc[u][bit], v = anc[v][bit];
  94.         return anc[u][0];
  95.     }
  96.    
  97.     T get_cost(int u, int dist){
  98.         if(dep[u] < dist) return -1;
  99.         return val[kth_ancestor(u, dist)];
  100.     }
  101.    
  102.     T query(int u, int k){
  103.         int l = 1, r = dep[u], ans = -1;
  104.         while(l <= r){
  105.             int m = l + (r - l) / 2;
  106.             (get_cost(u, m) <= k ? r = m - 1, ans = m : l = m + 1);
  107.         }
  108.         if(ans == -1)
  109.             return -1;
  110.         return kth_ancestor(u, ans);
  111.     }
  112.  
  113.     void build_cost(int root = 1, int p = 0){
  114.         for(auto& v : adj[root]){
  115.             if(v == p) continue;
  116.             build_cost(v, root);
  117.             val[root] = operation(val[root], val[v]);
  118.         }
  119.     }
  120.  
  121.     void build(int root = 1){
  122.         build_cost(root);
  123.         dfs(root);
  124.     }
  125.  
  126. };
  127.  
  128. void Solve(){
  129.     int n, q;
  130.     cin >> n >> q;
  131.     vector < vector < ll > > adj(n + 5);
  132.     vector < ll > values(n + 5), par(n + 5);
  133.     for(int i = 2; i <= n; i++)
  134.         cin >> par[i];
  135.     for(int i = 1; i <= n; i++)
  136.         cin >> values[i];
  137.     for(int i = 2; i <= n; i++)
  138.         adj[par[i]].push_back(i);
  139.     LCA < ll > lca(n, adj, values);
  140.     lca.build();
  141.     while(q--){
  142.         int u, k;
  143.         cin >> u >> k;
  144.         cout << lca.query(u, k) << '\n';
  145.     }
  146. }
  147.  
  148. int main(){
  149.     ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  150.     int test_cases = 1;
  151.     // cin >> test_cases;
  152.     for(int tc = 1; tc <= test_cases; tc++){
  153.         // cout << "Case #" << tc << ": ";
  154.         Solve();
  155.     }
  156.     return 0;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement