Advertisement
Jaydeep999997

Make n00b_land Great Again!

Oct 8th, 2020
924
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.64 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long double ld;
  5. typedef long long int ll;
  6. typedef pair<int,int> pi;
  7. typedef pair<long long,long long> pll;
  8.  
  9. #define endl '\n'
  10. #define ff first
  11. #define ss second
  12. #define pb push_back
  13. #define int long long
  14. #define sz(v) (int)v.size()
  15. #define inf 2147483647
  16. #define llinf 9223372036854775807
  17. #define all(v) v.begin(),v.end()
  18. #define bp(n) __builtin_popcountll(n)
  19. #define f(i,l,r) for(long long i=l;i<=r;i++)
  20. #define rf(i,r,l) for(long long i=r;i>=l;i--)
  21. #define fast ios_base::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
  22.  
  23. template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << '{'; string sep; for (const auto &x : v) os << sep << x, sep = ", "; return os << '}'; }
  24. template<typename T, size_t size> ostream& operator<<(ostream &os, const array<T, size> &arr) { os << '{'; string sep; for (const auto &x : arr) os << sep << x, sep = ", "; return os << '}'; }
  25. template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
  26.  
  27. void dbg_out() { cerr << endl; }
  28. template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  29.  
  30.  
  31. const int N=5e5+5,mod=1e9+7,bit=61;
  32.  
  33.  
  34. template<typename T>
  35. class fenwick
  36. {
  37.     public:
  38.         vector<T> fen;
  39.         int n;
  40.  
  41.         fenwick() {}
  42.  
  43.         fenwick(int _n,T val=T())
  44.         {
  45.             n=_n;
  46.             fen=vector<T> (n+1,val);
  47.         }
  48.  
  49.         void reset()
  50.         {
  51.             for(int i=0;i<(int)fen.size();i++)
  52.             {
  53.                 fen[i]=(T)0;
  54.             }
  55.         }
  56.  
  57.         T merge(T a,T b)
  58.         {
  59.             return a+b;
  60.         }
  61.  
  62.         void update(int idx,T val)
  63.         {
  64.             while(idx<=n)
  65.             {
  66.                 fen[idx]=merge(fen[idx],val);
  67.                 idx+=(idx & -idx);
  68.             }
  69.         }
  70.  
  71.         T query(int idx)
  72.         {
  73.             T ans{};
  74.             while(idx>0)
  75.             {
  76.                 ans=merge(ans,fen[idx]);
  77.                 idx-=(idx & -idx);
  78.             }
  79.             return ans;
  80.         }
  81.  
  82.         T from(int l,int r)
  83.         {
  84.             return query(r)-query(l-1);
  85.         }
  86. };
  87.  
  88. vector<int> adj[N],mid[N],my[N];
  89. int tin[N],tout[N],dep[N],req[N],F[N],X[N],D[N],l[N],r[N];
  90. int n,m,q,tim=0;
  91. fenwick<int> obj1,obj2;
  92.  
  93. void dfs(int u,int par,int d)
  94. {
  95.     tin[u]=++tim;
  96.     dep[u]=d;
  97.     for(auto &v:adj[u])
  98.     {
  99.         if(v!=par)
  100.         {
  101.             dfs(v,u,d+1);
  102.         }
  103.     }
  104.     tout[u]=tim;
  105. }
  106.  
  107. void apply(int id)
  108. {
  109.     int s=tin[F[id]];
  110.     int e=tout[F[id]];
  111.     obj1.update(s,X[id] - dep[F[id]] * D[id]);
  112.     obj1.update(e+1,-X[id] + dep[F[id]] * D[id]);
  113.     obj2.update(s,D[id]);
  114.     obj2.update(e+1,-D[id]);
  115. }
  116.  
  117. signed main()
  118. {
  119.     fast;
  120.  
  121.     cin>>n>>m;
  122.  
  123.     obj1 = fenwick<int> (n);
  124.     obj2 = fenwick<int> (n);
  125.  
  126.     f(i,2,n)
  127.     {
  128.         int p;
  129.         cin>>p;
  130.         adj[p].pb(i);
  131.     }
  132.  
  133.     f(i,1,n)
  134.     {
  135.         int ow;
  136.         cin>>ow;
  137.         my[ow].pb(i);
  138.     }
  139.  
  140.     dfs(1,0,1);
  141.  
  142.     f(i,1,m)
  143.     {
  144.         cin>>req[i];
  145.     }
  146.  
  147.     cin>>q;
  148.     f(i,1,q)
  149.     {
  150.         cin>>F[i]>>X[i]>>D[i];
  151.     }
  152.  
  153.     f(i,1,m)
  154.     {
  155.         l[i]=1;
  156.         r[i]=q+1;
  157.     }
  158.  
  159.     bool done=0;
  160.     while(!done)
  161.     {
  162.         done=1;
  163.         obj1.reset();
  164.         obj2.reset();
  165.         f(i,1,m)
  166.         {
  167.             if(l[i]!=r[i])
  168.             {
  169.                 done=0;
  170.                 int c_mid = (l[i]+r[i])>>1;
  171.                 mid[c_mid].pb(i);
  172.             }
  173.         }
  174.  
  175.         f(i,1,q)
  176.         {
  177.             apply(i);
  178.             while(!mid[i].empty())
  179.             {
  180.                 int par=mid[i].back();
  181.                 bool sat=0;
  182.                 int sum=0;
  183.                 for(auto &v:my[par])
  184.                 {
  185.                     int add=obj1.query(tin[v]);
  186.                     add+=(dep[v] * obj2.query(tin[v]));
  187.                     sum+=add;
  188.                     if(sum >= req[par])
  189.                     {
  190.                         sat=1;
  191.                         break;
  192.                     }
  193.                 }
  194.                 if(sat)
  195.                 {
  196.                     r[par]=i;
  197.                 }
  198.                 else
  199.                 {
  200.                     l[par]=i+1;
  201.                 }
  202.                 mid[i].pop_back();
  203.             }
  204.         }
  205.     }
  206.  
  207.     f(i,1,m)
  208.     {
  209.         assert(l[i] == r[i]);
  210.         if(r[i] <= q)
  211.         {
  212.             cout<<r[i]<<endl;
  213.         }
  214.         else
  215.         {
  216.             cout<<"rekt"<<endl;
  217.         }
  218.     }
  219.     return 0;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement