Advertisement
welleyth

COCI 2022. D

May 29th, 2022 (edited)
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6.  
  7. #define int long long
  8. #define mp make_pair
  9. #define pb push_back
  10.  
  11. //#pragma GCC optimize("Ofast")
  12. //#pragma GCC optimize("unroll-loops")
  13.  
  14. constexpr int INF = (int)1e18;
  15. constexpr int N = (int)1e5 + 111;
  16. constexpr int md = (int)1e9+7;
  17. constexpr int mdPower = (int)1e9+7 - 1;
  18. constexpr int M = (int)1e9;
  19.  
  20. mt19937 rnd(time(nullptr));
  21.  
  22. void add(int& a,int b){
  23.     a += b; if(a >= md) a -= md;
  24. }
  25. void sub(int& a,int b){
  26.     a -= b; if(a < 0) a += md;
  27. }
  28.  
  29. struct node{
  30.     node* l = nullptr;
  31.     node* r = nullptr;
  32.     int sum = 0;
  33.     bool all = false;
  34.     node(){}
  35. };
  36.  
  37. struct edge{
  38.     int to;
  39.     int l,r;
  40.     edge(){}
  41.     edge(int to,int l,int r):to(to),l(l),r(r){}
  42. };
  43.  
  44. vector<node*> roots;
  45. vector<edge> g[N];
  46. int ans[N];
  47. int id[N];
  48.  
  49. void upd(node* v,int l,int r,int tl,int tr){
  50.     if(l > r || tl > tr)
  51.         return;
  52.     if(v->all == true)
  53.         return;
  54.     if(l == tl && r == tr){
  55.         v->all = true;
  56.         v->sum = r - l + 1;
  57.         return;
  58.     }
  59.     int m = (l+r)>>1;
  60.     node* L = new node();
  61.     if(v->l != nullptr){
  62.         L->all = (v->l)->all;
  63.         L->sum = (v->l)->sum;
  64.         L->l = (v->l)->l;
  65.         L->r = (v->l)->r;
  66.     }
  67.     v->l = L;
  68.     upd(L,l,m,tl,min(tr,m));
  69.     node* R = new node();
  70.     if(v->r != nullptr){
  71.         R->all = (v->r)->all;
  72.         R->sum = (v->r)->sum;
  73.         R->l = (v->r)->l;
  74.         R->r = (v->r)->r;
  75.     }
  76.     v->r = R;
  77.     upd(R,m+1,r,max(m+1,tl),tr);
  78.     v->sum = (v->l)->sum + (v->r)->sum;
  79.     return;
  80. }
  81.  
  82. void dfs(int v,node* rt,int pr = -1){
  83.     ans[v] = rt->sum;
  84.     for(auto& e : g[v]){
  85.         int& to = e.to;
  86.         if(to == pr)
  87.             continue;
  88.         int& l = e.l, r = e.r;
  89.         node* nxt_rt = new node();
  90.         nxt_rt->all = rt->all;
  91.         nxt_rt->l = rt->l;
  92.         nxt_rt->r = rt->r;
  93.         nxt_rt->sum = rt->sum;
  94.         upd(nxt_rt,1,M,l,r);
  95.         dfs(to,nxt_rt,v);
  96.     }
  97.     return;
  98. }
  99.  
  100. void solve(){
  101.     int n,m;
  102.     cin >> n >> m;
  103.  
  104.     for(int i = 0; i < n-1; i++){
  105.         int a,b,l,r;
  106.         cin >> a >> b >> l >> r;
  107.         g[a].pb(edge(b,l,r));
  108.         g[b].pb(edge(a,l,r));
  109.     }
  110.  
  111.     node* rt = new node();
  112.     dfs(1,rt);
  113.  
  114.     for(int i = 2; i <= n; i++)
  115.         cout << ans[i] << "\n";
  116.  
  117.     return;
  118. }
  119.  
  120. signed main(){
  121.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  122. //    freopen("input.txt","r",stdin);
  123. //    freopen("output.txt","w",stdout);
  124.     int tests = 1;
  125. //    cin >> tests;
  126.     for(int test = 1; test <= tests; test++){
  127.         solve();
  128.     }
  129.     return 0;
  130. }
  131. /**
  132.  
  133. aaabbb
  134.  
  135. **/
  136.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement