Hydracody

Untitled

Apr 8th, 2023
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.21 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. // #define endl "\n"
  4. #define pb push_back
  5. #define pf push_front
  6. #define pob pop_back
  7. #define pof pop_front
  8. #define mp make_pair
  9. #define fi first
  10. #define se second
  11. #define set_bits __builtin_popcountll
  12. #define precise(ans)  cout<<fixed<<setprecision(15)<<ans
  13. #define fo(i,n) for(ll i=0;i<n;i++)
  14. #define Fo(i,k,n) for(ll i=k;k<n?i<n:i>n;k<n?i+=1:i-=1)
  15. #define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
  16. #define sz(x) ((ll)(x).size())
  17. #define all(x) x.begin(), x.end()
  18. #define PI 3.1415926535897932384626
  19. #define MOD 1000000007
  20. #define MOD1 998244353
  21. typedef long long ll; typedef unsigned long long ull; typedef long double lld; typedef pair<ll, ll>  pii; typedef pair<ll, ll>    pl; typedef vector<ll> vi; typedef vector<vi> vvi; typedef vector<vvi>    vvvi; typedef vector<ll>  vl; typedef vector<vl>  vvl; typedef vector<pii> vpii; typedef vector<pl>  vpl; template <typename T> using prq_mx  = priority_queue<T>; template <typename T> using prq_mn = priority_queue<T, vector<T>, greater<T>>;
  22. const double eps = 1e-9; const ll INF = (ll) 1e9; const ll inf64 = 2e18; const ll INF64 = 9e18;
  23. #ifndef ONLINE_JUDGE
  24. #define debug(x) cerr << #x <<" "; _prll(x); cerr << endl;
  25. #else
  26. #define debug(x)
  27. #endif
  28. void _prll(ll t) {cerr << t;} void _print(ll t) {cerr << t;} void _prll(string t) {cerr << t;} void _prll(char t) {cerr << t;} void _prll(lld t) {cerr << t;} void _prll(double t) {cerr << t;} void _prll(ull t) {cerr << t;} template <class T, class V> void _prll(pair <T, V> p); template <class T> void _prll(vector <T> v); template <class T> void _prll(set <T> v); template <class T, class V> void _prll(map <T, V> v); template <class T> void _prll(multiset <T> v); template <class T, class V> void _prll(pair <T, V> p) {cerr << "{"; _prll(p.fi); cerr << ","; _prll(p.se); cerr << "}";} template <class T> void _prll(vector <T> v) {cerr << "[ "; for (T i : v) {_prll(i); cerr << " ";} cerr << "]";} template <class T> void _prll(set <T> v) {cerr << "[ "; for (T i : v) {_prll(i); cerr << " ";} cerr << "]";} template <class T> void _prll(multiset <T> v) {cerr << "[ "; for (T i : v) {_prll(i); cerr << " ";} cerr << "]";} template <class T, class V> void _prll(map <T, V> v) {cerr << "[ "; for (auto i : v) {_prll(i); cerr << " ";} cerr << "]";}
  29. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  30. ll n,m;
  31. vl aa;
  32. vector<set<ll>> g;
  33. vl size;
  34. vl val;
  35. vl par;
  36. vector<set<pl>> size2;
  37. ll dfs(ll s,ll f){
  38.   size[s]=1;
  39.   val[s]=aa[s];
  40.   par[s]=f;
  41.   for(auto ch:g[s]){
  42.     if(ch==f)continue;
  43.     size[s]+=dfs(ch,s);
  44.     val[s]+=val[ch];
  45.     size2[s].insert({size[ch],ch});
  46.   }
  47.   return size[s];
  48. }
  49.  
  50.  
  51. void  chal(){
  52.   cin>>n>>m;
  53.   g.resize(n+1);
  54.   aa.resize(n+1);
  55.   size.resize(n+1);
  56.   size2.resize(n+1);
  57.   par.resize(n+1);
  58.   val.resize(n+1);
  59.   Fo(i,1,n+1){
  60.     cin>>aa[i];
  61.   }
  62.   // debug(aa);
  63.   fo(i,n-1){
  64.     ll u,v;
  65.     cin>>u>>v;
  66.     g[u].insert(v);
  67.     g[v].insert(u);
  68.   }
  69.   dfs(1,-1);
  70.   // debug(val);
  71.   // debug(size);
  72.   // debug(size2);
  73.   fo(i,m){
  74.     ll x,y;
  75.     cin>>x>>y;
  76.     if(x==1){
  77.       cout<<val[y]<<endl;
  78.     }else{
  79.       if(g[y].size()<=1|| par[y]==-1){
  80.         cout<<-1<<endl;
  81.         continue;
  82.       }
  83.       auto it=size2[y].begin();
  84.       ll x=it->se;
  85.       ll f=par[y];
  86.       // cout<<x<<": "<<endl;
  87.       g[f].erase(y);
  88.       size2[f].erase({size[y],y});
  89.  
  90.       size[y]-=size[x];
  91.       val[y]-=val[x];
  92.       size[x]+=size[y];
  93.       val[x]+=size[y];
  94.      
  95.       g[y].erase(x);
  96.       size2[y].erase(it);        
  97.       g[f].insert(x);
  98.       size2[f].insert({size[x],x});
  99.       par[x]=f;
  100.       par[y]=x;
  101.     }
  102.   }
  103.  
  104.  
  105.  
  106.  
  107. }
  108.  
  109.  
  110.  
  111.  
  112.  
  113. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  114. int32_t main() {
  115.   ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); srand(chrono::high_resolution_clock::now().time_since_epoch().count());
  116. #ifndef ONLINE_JUDGE
  117.   freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); freopen("Error.txt", "w", stderr);
  118. #endif
  119.   ll  t; t = 1;
  120.   // cin >> t;
  121.   for (ll i = 1; i <= t; i++) {
  122.     chal();
  123.   } return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment