1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std;
const int CN = 5e5 + 5;
int read(){ int s = 0,ne = 1; char c = getchar(); while(c < '0' || c > '9') ne = c == '-' ? -1 : 1, c = getchar(); while(c >= '0' && c <= '9') s = (s << 1) + (s << 3) + c - '0', c = getchar(); return s * ne; }
class fs {public: int to,nxt; void init(int t,int n) {to = t, nxt = n;} } E[CN << 1]; int hd[CN], ecnt = 0; void add(int x,int y) {E[++ecnt].init(y, hd[x]); hd[x] = ecnt;}
class TRIE { public: int rt[CN], ch[CN * 30][2], w[CN * 30], MAXH, idx; #define lc ch[u][0] #define rc ch[u][1] TRIE() {idx = 0, MAXH = 31;} int make() {return ++idx;} void ins(int &u, int v, int x, int dep){ if(!u) u = make(); if(dep < 0) return (void)(w[u] = w[v] + 1); int b = (x >> dep) & 1; ch[u][!b] = ch[v][!b]; ins(ch[u][b], ch[v][b], x, dep - 1); w[u] = w[lc] + w[rc]; } int qm(int u, int v, int k, int dep){ if(dep < 0) return 0; int b = (k >> dep) & 1; if(w[ ch[u][!b] ] > w[ ch[v][!b] ]) return (1 << dep) | qm(ch[u][!b], ch[v][!b], k, dep - 1); else return qm(ch[u][b], ch[v][b], k, dep - 1); } } D;
int n, q, v[CN], oid[CN];
int top[CN], id[CN], sz[CN], imp[CN], dep[CN], fa[CN], idx = 0; void dfs1(int u, int p) { dep[u] = dep[p] + 1, sz[u] = 1, fa[u] = p; int mx = 0; for(int k = hd[u]; k; k = E[k].nxt){ int v = E[k].to; if(v ^ p) dfs1(v, u), sz[u] += sz[v], mx = sz[v] > mx ? imp[u] = v, sz[v] : mx; } } void dfs2(int u, int t){ top[u] = t, id[u] = ++idx; if(imp[u]) dfs2(imp[u], t); for(int k = hd[u]; k; k = E[k].nxt){ int v = E[k].to; if(v ^ imp[u] && v ^ fa[u]) dfs2(v, v); } } int qu(int x, int y, int z){ int ans = 0; while(top[x] != top[y]){ if(dep[ top[x] ] < dep[ top[y] ]) swap(x, y); ans = max(ans, D.qm(D.rt[ id[x] ], D.rt[ id[ top[x] ] - 1 ], z, D.MAXH)); x = fa[ top[x] ]; } if(dep[x] < dep[y]) swap(x, y); ans = max(ans ,D.qm(D.rt[ id[x] ], D.rt[ id[y] - 1 ], z, D.MAXH)); return ans; }
bool cmp(int x, int y) {return id[x] < id[y];}
int main() { n = read(), q = read(); for(int i = 1; i <= n; i++) v[i] = read(), oid[i] = i; for(int i = 1; i < n; i++) {int u = read(), v = read(); add(u, v), add(v, u);}
dfs1(1, 0), dfs2(1, 1); sort(oid + 1, oid + n + 1, cmp); for(int i = 1; i <= n; i++) D.ins(D.rt[i], D.rt[i - 1], v[ oid[i] ], D.MAXH);
while(q--){ int o = read(), x = read(), y = read(), z; if(o == 1) printf("%d", D.qm(D.rt[ id[x] + sz[x] - 1 ], D.rt[ id[x] - 1 ], y, D.MAXH)), puts(""); else z = read(), printf("%d", qu(x, y, z)), puts(""); } }
|