Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int n, m, dp[100100][31]={}, fortuna[100100]={}, reunioes[100100]={}, bit[100100];
- vector<int> filhas[100100], min_participante[100100];
- void update(int x, int v){
- for(int i=x; i<=100100; i+=(i&(-i))){
- bit[i]+=v;
- }
- }
- int query(int cur){
- int sum=0;
- for(int i=cur; i>0; i-=(i&(-i))){
- sum+=bit[i];
- }
- return sum;
- }
- void dfs(int cur){
- for(auto &x:min_participante[cur]){
- update(x, 1);
- }
- reunioes[cur]=query(fortuna[cur]);
- for(auto &x:filhas[cur]){
- dfs(x);
- }
- for(auto &x:min_participante[cur]){
- update(x, -1);
- }
- }
- int main(){
- ios_base::sync_with_stdio(0); cin.tie(0);
- cin >> n >> m;
- for(int i=1; i<=n; i++){
- int ai, bi;
- cin >> ai >> bi;
- fortuna[i]=ai;
- dp[i][0]=bi;
- if(i!=1)filhas[bi].push_back(i);
- }
- dp[1][0]=-1;
- for(int i=1; i<=20; i++){
- for(int j=1; j<=n; j++){
- if(dp[j][i-1]==-1)dp[j][i]=-1;
- else dp[j][i]=dp[dp[j][i-1]][i-1];
- }
- }
- for(int i=0; i<m; i++){
- int anf, mn, mx;
- cin >> anf >> mn >> mx;
- for(int i=20; i>=0; i--){
- if(dp[anf][i]!=-1){
- if(fortuna[dp[anf][i]]<=mx){
- anf=dp[anf][i];
- }
- }
- }
- min_participante[anf].push_back(mn);
- }
- dfs(1);
- for(int i=1; i<=n; i++){
- cout << reunioes[i] << " ";
- }
- cout << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement