orazma

l.cpp

Apr 9th, 2026
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.96 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define pb push_back
  4. #define f first
  5. #define s second
  6. #define mp make_pair
  7.  
  8. using namespace std;
  9. const int MAXN = 1e5 + 10;
  10. const int INF = 1e9 + 7;
  11. int p[MAXN], tin[MAXN], tout[MAXN];
  12. vector <int> g[MAXN];
  13. bool was[MAXN];
  14.  
  15. bool upper(int a, int b){
  16.     return (tin[a] < tin[b] && tout[a] > tout[b]);
  17. }
  18. int timer;
  19.  
  20. void dfs(int v){
  21.     was[v] = 1;
  22.     tin[v] = ++timer;
  23.  
  24.     for (int to : g[v]){
  25.         if (!was[to]){
  26.             dfs(to);
  27.         }
  28.     }
  29.     tout[v] = ++timer;
  30. }
  31. vector <pair <int, int> > t[4 * MAXN];
  32.  
  33. vector <pair <int, int>> combine(int v){
  34.     vector <pair <int, int> > new_v;
  35.     int it1 = 0;
  36.     int it2 = 0;
  37.     int len1 = t[v << 1].size();
  38.     int len2 = t[(v << 1) | 1].size();
  39.  
  40.     while (it1 < len1 && it2 < len2){
  41.         if (t[v << 1][it1].first > t[(v << 1) | 1][it2].first){
  42.             new_v.pb(t[v << 1][it1]);
  43.             it1++;
  44.             if (new_v.size() > 1){
  45.                 int len = new_v.size();
  46.                 new_v[len - 1].s = min(new_v[len - 1].s, new_v[len - 2].s);
  47.             }
  48.         }
  49.         else{
  50.             new_v.pb(t[(v << 1) | 1][it2]);
  51.             it2++;
  52.             if (new_v.size() > 1){
  53.                 int len = new_v.size();
  54.                 new_v[len - 1].s = min(new_v[len - 1].s, new_v[len - 2].s);
  55.             }
  56.         }
  57.     }
  58.  
  59.     while (it1 < len1){
  60.         new_v.pb(t[v << 1][it1]);
  61.         it1++;
  62.         if (new_v.size() > 1){
  63.             int len = new_v.size();
  64.             new_v[len - 1].s = min(new_v[len - 1].s, new_v[len - 2].s);
  65.         }
  66.     }
  67.  
  68.     while (it2 < len2){
  69.         new_v.pb(t[(v << 1) | 1][it2]);
  70.         it2++;
  71.         if (new_v.size() > 1){
  72.             int len = new_v.size();
  73.             new_v[len - 1].s = min(new_v[len - 1].s, new_v[len - 2].s);
  74.         }
  75.     }
  76.  
  77.     return new_v;
  78. }
  79.  
  80. void build(int v, int tl, int tr){
  81.     if (tl > tr)
  82.         return;
  83.     if (tl == tr){
  84.         t[v].clear();
  85.         t[v].push_back({tin[p[tl]], tout[p[tl]]});
  86.         return;
  87.     }
  88.     int tm = (tl + tr) >> 1;
  89.     build(v << 1, tl, tm);
  90.     build((v << 1) | 1, tm + 1, tr);
  91.     t[v] = combine(v);
  92. }
  93.  
  94. int get(int v, int tl, int tr, int l, int r, int x){
  95.     if (l > r){
  96.         return INF;
  97.     }
  98.     if (tl == l && tr == r){
  99.         int pos = t[v].size();
  100.         int left = 0;
  101.         int right = t[v].size() - 1;
  102.         while (left <= right){
  103.             int mid = (left + right) / 2;
  104.             if (t[v][mid].first >= tin[x]){
  105.                 pos = mid;
  106.                 left = mid + 1;
  107.             }
  108.             else{
  109.                 right = mid - 1;
  110.             }
  111.         }
  112.  
  113.         if (pos == t[v].size()){
  114.             return INF;
  115.         }
  116.         return (t[v][pos].second);
  117.     }
  118.     int tm = (tl + tr) >> 1;
  119.     return min(get(v << 1, tl, tm, l, min(r, tm), x),
  120.                get((v << 1) | 1, tm + 1, tr, max(l, tm + 1), r, x));
  121. }
  122.  
  123. void solve() {
  124.     int n, q;
  125.     cin >> n >> q;
  126.     for (int i = 1; i <= n; i++){
  127.         g[i].clear();
  128.         was[i] = 0;
  129.     }
  130.     for (int i = 1; i < n; i++){
  131.         int x, y;
  132.         cin >> x >> y;
  133.         g[x].pb(y);
  134.         g[y].pb(x);
  135.     }
  136.     for (int i = 1; i <= n; i++){
  137.         cin >> p[i];
  138.     }
  139.     timer = 0;
  140.     dfs(1);
  141.     build(1, 1, n);
  142. /*
  143.     for (auto [ti, to] : t[2]){
  144.         cout << "# " << ti << ' ' << to << endl;
  145.     }
  146.  
  147.     for (int i = 1; i <= 5; i++){
  148.         cout << "!!! " << t[i].size() << ' ';
  149.     }
  150.     cout << endl;*/
  151.     for (int i = 1; i <= q; i++){
  152.         int l, r, x;
  153.         cin >> l >> r >> x;
  154.  
  155.         if (get(1, 1, n, l, r, x) <= tout[x]){
  156.             cout << "YES\n";
  157.         }
  158.         else{
  159.             cout << "NO\n";
  160.         }
  161.     }
  162. }
  163.  
  164. int main(){
  165.     ios::sync_with_stdio(0);
  166.     cin.tie(0);
  167.     cout.tie(0);
  168.  
  169.     int ttt = 1;
  170.     cin >> ttt;
  171.     while (ttt--){
  172.         solve();
  173.     }
  174. }
  175. /*
  176. 1
  177. 3 5
  178. 1 2
  179. 2 3
  180. 1 2 3
  181. 1 2 2
  182. 1 2 3
  183. 2 3 1
  184. 1 2 3
  185. 2 3 3
  186.  
  187. */
  188.  
Advertisement
Add Comment
Please, Sign In to add comment