View difference between Paste ID: iTRkw1s6 and f0kiPsZb
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
*/