Advertisement
leanchec

fortunas.cpp

Aug 23rd, 2023
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n, m, dp[100100][31]={}, fortuna[100100]={}, reunioes[100100]={}, bit[100100];
  5. vector<int> filhas[100100], min_participante[100100];
  6.  
  7. void update(int x, int v){
  8.     for(int i=x; i<=100100; i+=(i&(-i))){
  9.         bit[i]+=v;
  10.     }
  11. }
  12.  
  13. int query(int cur){
  14.     int sum=0;
  15.     for(int i=cur; i>0; i-=(i&(-i))){
  16.         sum+=bit[i];
  17.     }
  18.  
  19.     return sum;
  20. }
  21.  
  22. void dfs(int cur){
  23.     for(auto &x:min_participante[cur]){
  24.         update(x, 1);
  25.     }
  26.     reunioes[cur]=query(fortuna[cur]);
  27.     for(auto &x:filhas[cur]){
  28.         dfs(x);
  29.     }
  30.     for(auto &x:min_participante[cur]){
  31.         update(x, -1);
  32.     }
  33. }
  34.  
  35. int main(){
  36.     ios_base::sync_with_stdio(0); cin.tie(0);
  37.     cin >> n >> m;
  38.  
  39.     for(int i=1; i<=n; i++){
  40.         int ai, bi;
  41.         cin >> ai >> bi;
  42.         fortuna[i]=ai;
  43.         dp[i][0]=bi;
  44.         if(i!=1)filhas[bi].push_back(i);
  45.     }
  46.  
  47.     dp[1][0]=-1;
  48.  
  49.     for(int i=1; i<=20; i++){
  50.         for(int j=1; j<=n; j++){
  51.             if(dp[j][i-1]==-1)dp[j][i]=-1;
  52.             else dp[j][i]=dp[dp[j][i-1]][i-1];
  53.         }
  54.     }
  55.  
  56.  
  57.  
  58.     for(int i=0; i<m; i++){
  59.         int anf, mn, mx;
  60.         cin >> anf >> mn >> mx;
  61.  
  62.         for(int i=20; i>=0; i--){
  63.             if(dp[anf][i]!=-1){
  64.                 if(fortuna[dp[anf][i]]<=mx){
  65.                     anf=dp[anf][i];
  66.                 }
  67.             }
  68.         }
  69.         min_participante[anf].push_back(mn);
  70.     }
  71.  
  72.     dfs(1);
  73.  
  74.     for(int i=1; i<=n; i++){
  75.         cout << reunioes[i] << " ";
  76.     }
  77.     cout << '\n';
  78.  
  79.     return 0;
  80. }
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement