Advertisement
Josif_tepe

Untitled

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