Josif_tepe

Untitled

Dec 7th, 2025
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = 350005;
  5.  
  6. vector<int> graph[maxn];
  7. bool visited[maxn];
  8. int segment_tree[3 * maxn];
  9. vector<int> topological_sorting;
  10. void dfs(int node) {
  11.     visited[node] = true;
  12.     for(int i = 0; i < (int) graph[node].size(); i++) {
  13.         int neighbour = graph[node][i];
  14.         if(!visited[neighbour]) {
  15.             dfs(neighbour);
  16.         }
  17.     }
  18.    
  19.     topological_sorting.push_back(node);
  20. }
  21.  
  22. void build_tree(int L, int R, int node) {
  23.     if(L == R) {
  24.         segment_tree[node] = 0;
  25.     }
  26.     else {
  27.         int middle = (L + R) / 2;
  28.         build_tree(L, middle, 2 * node);
  29.         build_tree(middle + 1 ,R, 2 * node + 1);
  30.         segment_tree[node] = segment_tree[2 * node] + segment_tree[2 * node + 1];
  31.     }
  32. }
  33. // L R i j L R
  34. int query(int i, int j, int L, int R, int node) {
  35.     if(i <= L and R <= j) {
  36.         return segment_tree[node];
  37.     }
  38.     if(R < i or j < L) {
  39.         return 0;
  40.     }
  41.    
  42.     int middle = (L + R) / 2;
  43.     return query(i, j, L, middle, 2 * node) + query(i, j, middle + 1, R, 2 * node + 1);
  44. }
  45.  
  46. void update(int idx, int new_value, int L, int R, int node) {
  47.     if(L == R) {
  48.         segment_tree[node] += new_value;
  49.         return;
  50.     }
  51.     int middle = (L + R) / 2;
  52.    
  53.     if(idx <= middle) {
  54.         update(idx, new_value, L, middle, 2 * node);
  55.     }
  56.     else {
  57.         update(idx, new_value, middle + 1, R, 2 * node + 1);
  58.     }
  59.     segment_tree[node] = segment_tree[2 * node] + segment_tree[2 * node + 1];
  60. }
  61. int main()
  62. {
  63.     ios_base::sync_with_stdio(false);
  64.     int n;
  65.     cin >> n;
  66.    
  67.     for(int i = 0; i < n; i++) {
  68.         char c;
  69.         cin >> c;
  70.        
  71.         if(c == 'K') {
  72.             graph[i + 1].push_back(i + 1);
  73.         }
  74.         else {
  75.             int p;
  76.             cin >> p;
  77.             graph[p].push_back(i + 1);
  78.         }
  79.     }
  80.    
  81.     memset(visited, false, sizeof visited);
  82.    
  83.     for(int i = 1; i <= n; i++) {
  84.         if(!visited[i]) {
  85.             dfs(i);
  86.         }
  87.     }
  88.    
  89.     build_tree(0, n + 1, 1);
  90.    
  91.     vector<int> res(n + 1);
  92.     for(int i = 0; i < n; i++) {
  93.         update(topological_sorting[i], 1, 0, n + 1, 1);
  94.         res[topological_sorting[i]] = query(0, topological_sorting[i], 0, n + 1, 1);
  95.     }
  96.    
  97.     for(int i = 1; i <= n; i++) {
  98.         cout << res[i] << "\n";
  99.     }
  100.    
  101.     return 0;
  102. }
  103.  
Advertisement
Add Comment
Please, Sign In to add comment