SHOW:
|
|
- or go back to the newest paste.
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 mem(a,b) memset(a,b,sizeof a) |
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],st[N],ed[N],node[N]; |
31 | + | int n,q,t,a[N],start[N],endd[N],node[N]; |
32 | char s[10]; | |
33 | ||
34 | - | int T[N],P[N][17],L[N]; |
34 | + | int T[N],per[N][17],L[N]; |
35 | - | vvi adjL(N); |
35 | + | vi adjL[N]; |
36 | bool vis[N]; | |
37 | ||
38 | void dfs(int x, int level){ | |
39 | - | st[x] = ++t; |
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 | - | ed[x] = t; |
50 | + | endd[x] = t; |
51 | } | |
52 | ||
53 | - | void chRoot(int root){ |
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 | - | P[i][j] = -1; |
60 | + | per[i][j] = -1; |
61 | ||
62 | - | lp(i,1,n) P[i][0] = T[i]; |
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 (P[i][j-1] != -1) |
66 | + | if (per[i][j-1] != -1) |
67 | - | P[i][j] = P[P[i][j-1]][j-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 = P[p][i]; |
79 | + | p = per[p][i]; |
80 | ||
81 | if (p == q) return p; | |
82 | ||
83 | for (int i = log; i >= 0; i--) | |
84 | - | if (P[p][i] != -1 && P[p][i] != P[q][i]) |
84 | + | if (per[p][i] != -1 && per[p][i] != per[q][i]) |
85 | - | p = P[p][i], q = P[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]]); |
99 | + | lp(i,start[k],endd[k]) ret = max(ret, w ^ a[node[i]]); |
100 | return ret; | |
101 | } | |
102 | ||
103 | int main(){ | |
104 | - | read2i(n,q); |
104 | + | scanf("%d%d",&n,&q); |
105 | - | lp(i,1,n) readi(a[i]); |
105 | + | lp(i,1,n) scanf("%d",&a[i]); |
106 | ||
107 | lp(i,1,n-1){ | |
108 | int x,y; | |
109 | - | read2i(x,y); |
109 | + | scanf("%d%d",&x,&y); |
110 | adjL[x].pb(y); | |
111 | adjL[y].pb(x); | |
112 | } | |
113 | ||
114 | - | chRoot(1); |
114 | + | Root(1); |
115 | ||
116 | while(q--){ | |
117 | scanf("%s",s); | |
118 | if(s[0] == 'D'){ | |
119 | int u,v,w; | |
120 | - | read3i(u,v,w); |
120 | + | scanf("%d%d%d",&u,&v,&w); |
121 | divide(u,v,w); | |
122 | } | |
123 | else{ | |
124 | int k,w; | |
125 | - | read2i(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 | */ |