1Too_Ez

Untitled

Jul 1st, 2024
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. #pragma GCC optimize("O3,unroll-loops")
  2. #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
  3.  
  4. #include <bits/stdc++.h>
  5. //#include<ext/pb_ds/assoc_container.hpp>
  6. //#include<ext/pb_ds/tree_policy.hpp>
  7. using namespace std;
  8. //using namespace chrono;
  9. //using namespace __gnu_pbds;
  10.  
  11. #define ll long long
  12.  
  13. //typedef tree<int , null_type, less<int> , rb_tree_tag , tree_order_statistics_node_update> ordered_set; // *p.find_by_order(), p.order_of_key()
  14. //typedef tree<pair<ll, int>, null_type, less<pair<ll, int> >, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset; // With find_by_order and use ->fi/se and not .fi/se
  15. //Insert as {Value, idx in original array}
  16. // For searching p.lower_bound({Value, x}) where, x = 0 for lower_bound, x = IDX for actual find, x = INF for upper_bound
  17. // Eg. p.erase(p.lower_bound({7, 2}))
  18.  
  19. #define fi first
  20. #define se second
  21. #define pf push_front
  22. #define pb push_back
  23. #define ppb pop_back
  24. #define ppf pop_front
  25. #define ld long double
  26. #define vi vector<int>
  27. #define vi2 vector<vector<int>>
  28. #define vll vector<ll>
  29. #define vll2 vector<vector<long long>>
  30. #define vb vector<bool>
  31. #define mii map<int,int>
  32. #define mci map<char,int>
  33. #define pii pair<int,int>
  34. #define vpii vector<pii>
  35. #define FOR(i,x,n) for(int i=x; i<n; i++)
  36. #define ROF(i,x,n) for(int i=x; i>=n; i--)
  37. #define trav(u, v) for(auto &u: v)
  38. #define all(v) v.begin(),v.end()
  39. #define MIN(v) *min_element(all(v))
  40. #define MAX(v) *max_element(all(v))
  41. #define lb(v, x) dist(v.begin(), lower_bound(all(v), x))
  42. #define ub(v, x) dist(v.begin(), upper_bound(all(v), x))
  43. #define INF LLONG_MAX
  44. #define CEIL(a, b) (a+b-1)/b
  45. #define sz(x) ((int)x.size())
  46. #define um unordered_map
  47. #define nl "\n"
  48. const int MOD = 1000000007;
  49. //const int MOD = 998244353;
  50.  
  51. #ifdef FalleN
  52. #include "debugger.h"
  53. #define debug(...) cerr << "[" << #__VA_ARGS__ << "] = ["; _print(__VA_ARGS__)
  54. #else
  55. #define debug(...) 2
  56. #endif
  57.  
  58. //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  59. //ll getRandomNumber(ll l, ll r) {return uniform_int_distribution<ll>(l, r)(rng);}
  60.  
  61. struct custom_hash {
  62. static uint64_t splitmix64(uint64_t x) {
  63. x += 0x9e3779b97f4a7c15;
  64. x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
  65. x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
  66. return x ^ (x >> 31);
  67. }
  68.  
  69. size_t operator()(uint64_t x) const {
  70. static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
  71. return splitmix64(x + FIXED_RANDOM);
  72. }
  73. };
  74. //unordered_map<long long, int, custom_hash> safe_map;
  75.  
  76. void add_self(ll &a, ll b)
  77. {
  78. a += b;
  79. if(a >= MOD) a -= MOD;
  80. }
  81.  
  82. ll ext_gcd(ll a, ll b, ll &x, ll &y) {if(!b) {x = 1; y = 0; return a;} ll x1, y1; ll gc = ext_gcd(b, a % b, x1, y1); x = y1; y = x1 - y1 * (a / b); return gc;}
  83. ll mod_pow(ll x, ll n, ll m) {if(!n) return 1%m; ll u = mod_pow(x,n/2,m); u = (u*u)%m; if(n%2) u = (u*x)%m; return u;}
  84. ll mod_inv(ll a, ll m) {ll x,y; ll gc = ext_gcd(a, m, x, y); assert(gc == 1LL); x = (x % m + m) % m; return x;}
  85. ll mod_inv_prime(ll a, ll m) {return mod_pow(a, m-2, m);}
  86. ll mod_add(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a + b) % m) + m) % m;}
  87. ll mod_sub(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a - b) % m) + m) % m;}
  88. ll mod_mul(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a * b) % m) + m) % m;}
  89. ll mod_div(ll a, ll b, ll m) {a = a % m; b = b % m; return (mod_mul(a, mod_inv(b, m), m) + m) % m;}
  90. ll mod_div_prime(ll a, ll b, ll m) {a = a % m; b = b % m; return (mod_mul(a, mod_inv_prime(b, m), m) + m) % m;}
  91. ll phi(ll n) {ll result = n; for (ll i = 2; i * i <= n; i++) {if (!(n % i)) {while (!(n % i)) {n /= i;} result -= result / i;}} if(n > 1) {result -= result / n;} return result;}
  92.  
  93. bool multi_test_cases = 0;
  94.  
  95. const int nax = 2e5 + 5;
  96. int n;
  97. int parent[nax];
  98. int depth[nax];
  99. int heavy[nax];
  100. int head[nax];
  101. int vals[nax];
  102. int arr[nax];
  103. int t[2*nax];
  104. int pos[nax];
  105. vi adj[nax];
  106. int cur_idx = 0;
  107.  
  108. void max_self(int &a, int b)
  109. {
  110. a = max(a, b);
  111. }
  112.  
  113. void build()
  114. {
  115. FOR(i,0,n) t[n+i] = arr[i];
  116. ROF(i,n-1,1) t[i] = max(t[2*i], t[2*i+1]);
  117. }
  118.  
  119. int max_query(int l, int r)
  120. {
  121. l += n; r += n;
  122.  
  123. int maxi = INT_MIN;
  124. while(l < r)
  125. {
  126. if(l&1) max_self(maxi, t[l++]);
  127. if(r&1) max_self(maxi, t[--r]);
  128.  
  129. l /= 2;
  130. r /= 2;
  131. }
  132.  
  133. return maxi;
  134. }
  135.  
  136. void update(int posi, int new_val)
  137. {
  138. posi += n;
  139. t[posi] = new_val;
  140. while(posi > 1)
  141. {
  142. posi /= 2;
  143. t[posi] = max(t[2*posi], t[2*posi+1]);
  144. }
  145. }
  146.  
  147. int dfs(int s)
  148. {
  149. int siz = 1;
  150. int max_child_size = 0;
  151. trav(u, adj[s])
  152. {
  153. if(u==parent[s]) continue;
  154.  
  155. parent[u] = s;
  156. depth[u] = depth[s] + 1;
  157. int child_size = dfs(u);
  158. siz += child_size;
  159. if(child_size > max_child_size) {max_child_size = child_size; heavy[s] = u;}
  160. }
  161.  
  162. return siz;
  163. }
  164.  
  165. void decompose(int s, int h)
  166. {
  167. head[s] = h;
  168. arr[cur_idx] = vals[s];
  169. pos[s] = cur_idx; cur_idx++;
  170. if(heavy[s] != -1) decompose(heavy[s], h);
  171. trav(u, adj[s])
  172. {
  173. if(u != parent[s] && u != heavy[s]) decompose(u, u);
  174. }
  175. }
  176.  
  177. int main()
  178. {
  179. ios_base::sync_with_stdio(0);
  180. cin.tie(0);
  181. cout.tie(0);
  182.  
  183. int tt = 1;
  184. if(multi_test_cases) cin>>tt;
  185.  
  186. while(tt--)
  187. {
  188. int q;
  189. cin>>n>>q;
  190.  
  191. FOR(i,0,n) cin>>vals[i];
  192.  
  193. FOR(i,0,n-1)
  194. {
  195. int a,b;
  196. cin>>a>>b;
  197.  
  198. adj[a-1].pb(b-1);
  199. adj[b-1].pb(a-1);
  200. }
  201.  
  202. FOR(i,0,n) heavy[i] = -1;
  203. dfs(0);
  204. decompose(0,0);
  205.  
  206. build();
  207.  
  208. while(q--)
  209. {
  210. int num,a,b;
  211. cin>>num>>a>>b;
  212.  
  213. if(num==1) update(pos[a-1], b);
  214. else
  215. {
  216. a--; b--;
  217. int res = 0;
  218. for(; head[a] != head[b]; b = parent[head[b]])
  219. {
  220. if(depth[head[a]] > depth[head[b]]) swap(a, b);
  221. int heavy_max = max_query(pos[head[b]], pos[b]+1);
  222. res = max(res, heavy_max);
  223. }
  224. if(depth[a] > depth[b]) swap(a, b);
  225. int heavy_max = max_query(pos[a], pos[b]+1);
  226. res = max(res, heavy_max);
  227.  
  228. cout<< res << " ";
  229. }
  230. }
  231. cout<<nl;
  232. }
  233.  
  234.  
  235. return 0;
  236. }
  237.  
  238.  
  239.  
Advertisement
Add Comment
Please, Sign In to add comment