Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <bits/stdc++.h>
  2. #define f first
  3. #define s second
  4. #define mp make_pair
  5. #define pb push_back
  6. #define lp(i,a,n) for(int i=(a);i<=(int)(n);++i)
  7. #define lpd(i,a,n) for(int i=(a);i>=(int)(n);--i)
  8. #define clr(a,b) memset(a,b,sizeof a)
  9. #define all(v) v.begin(),v.end()
  10. #define println(a) cout <<(a) <<endl
  11. #define sz(x) ((int)(x).size())
  12. #define readi(x) scanf("%d",&x)
  13. #define read2i(x,y) scanf("%d%d",&x,&y)
  14. #define read3i(x,y,z) scanf("%d%d%d",&x,&y,&z)
  15. #define readll(x) scanf("%I64d",&x)
  16. #define mod 1000000007
  17. #define eps 1e-6
  18. #define infi 1000000000
  19. #define infll 1000000000000000000ll
  20. using namespace std;
  21. typedef long long ll;
  22. typedef pair<int, int> pii;
  23. typedef pair<ll, ll> pll;
  24. typedef vector<int> vi;
  25. typedef vector<vi> vvi;
  26. typedef vector<ll> vll;
  27. typedef set<int> si;
  28. typedef map<int,int> mii;
  29.  
  30. const int N = 50002, MOD = 1009;
  31. int n,q,t,a[N],start[N],endd[N],node[N];
  32. char s[10];
  33.  
  34. int T[N],per[N][17],L[N];
  35. vi adjL[N];
  36. bool vis[N];
  37.  
  38. void dfs(int x, int level){
  39. start[x] = ++t;
  40. node[t] = x;
  41. vis[x] = true;
  42. lp(i,0,adjL[x].size()-1){
  43. int child = adjL[x][i];
  44. if(!vis[child]){
  45. T[child] = x;
  46. L[child] = level+1;
  47. dfs(child,level+1);
  48. }
  49. }
  50. endd[x] = t;
  51. }
  52.  
  53. void Root(int root){
  54. T[root] = root;
  55. L[root] = 1;
  56. dfs(root,1);
  57.  
  58. lp(i,1,n)
  59. for (int j = 0; (1ll<<j) < n; j++)
  60. per[i][j] = -1;
  61.  
  62. lp(i,1,n) per[i][0] = T[i];
  63.  
  64. for (int j = 1; (1ll<<j) < n; j++)
  65. lp(i,1,n)
  66. if (per[i][j-1] != -1)
  67. per[i][j] = per[per[i][j-1]][j-1];
  68. }
  69.  
  70. int query(int p, int q){
  71. if (L[p] < L[q]) swap(p,q);
  72.  
  73. int log;
  74. for (log = 1; (1ll<<log) <= L[p]; log++);
  75. log--;
  76.  
  77. lpd(i,log,0)
  78. if (L[p] - (1ll << i) >= L[q])
  79. p = per[p][i];
  80.  
  81. if (p == q) return p;
  82.  
  83. for (int i = log; i >= 0; i--)
  84. if (per[p][i] != -1 && per[p][i] != per[q][i])
  85. p = per[p][i], q = per[q][i];
  86.  
  87. return T[p];
  88. }
  89.  
  90. void divide(int u, int v, int w){
  91. int lca = query(u,v);
  92. a[lca] = a[lca]/w + (a[lca]%w != 0);
  93. while(u != lca) a[u] = a[u]/w + (a[u]%w != 0), u = T[u];
  94. while(v != lca) a[v] = a[v]/w + (a[v]%w != 0), v = T[v];
  95. }
  96.  
  97. int solve(int k, int w){
  98. int ret = 0;
  99. lp(i,st[k],ed[k]) ret = max(ret, w ^ a[node[i]]);
  100. return ret;
  101. }
  102.  
  103. int main(){
  104. scanf("%d%d",&n,&q);
  105. lp(i,1,n) scanf("%d",&a[i]);
  106.  
  107. lp(i,1,n-1){
  108. int x,y;
  109. scanf("%d%d",&x,&y);
  110. adjL[x].pb(y);
  111. adjL[y].pb(x);
  112. }
  113.  
  114. Root(1);
  115.  
  116. while(q--){
  117. scanf("%s",s);
  118. if(s[0] == 'D'){
  119. int u,v,w;
  120. scanf("%d%d%d",&u,&v,&w);
  121. divide(u,v,w);
  122. }
  123. else{
  124. int k,w;
  125. scanf("%d%d",&k,&w);
  126. if(s[0] == 'M') a[k] = a[k] * w % MOD;
  127. else printf("%d\n", solve(k,w));
  128. }
  129. }
  130. }
  131.  
  132. /*
  133. freopen("input.txt","r",stdin);
  134. freopen("output.txt","w",stdout);
  135. ios::sync_with_stdio(0);cin.tie(0);
  136. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement