func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100005;   int n, m, q;   int c[N];   vector<pair<long long, int> > girl[N];   int head[N], to[N * 2], pre[N * 2], tot;   void addedge(int u, int v) {     to[++tot] = v;     pre[tot] = head[u];     head[u] = tot;   }   int L[N], R[N], dfn, id[N], dep[N], top[N], son[N], fa[N];   int dfs1(int u, int depth) {     dep[u] = depth;     int mx = 0, sum = 1, tmp;     for (int v, i = head[u]; i; i = pre[i])       if ((v = to[i]) != fa[u]) {         fa[v] = u;         tmp = dfs1(v, depth + 1);         if (tmp > mx) mx = tmp, son[u] = v;         sum += tmp;       }     return sum;   }   void dfs2(int u, int anc) {     top[u] = anc;     L[u] = ++dfn;     id[dfn] = u;     if (son[u]) dfs2(son[u], anc);     for (int i = head[u]; i; i = pre[i])       if (to[i] != fa[u] && to[i] != son[u]) dfs2(to[i], to[i]);     R[u] = dfn;   }   pair<long long, int> min(pair<long long, int> a, pair<long long, int> b) {     if (a.first < b.first) return a;     if (a.first > b.first) return b;     if (c[a.second] < c[b.second]) return a;     return b;   }   pair<long long, int> mi[N * 4];   long long add[N * 4];   void up(int i) {     mi[i] = min(mi[i << 1], mi[i << 1 | 1]);     mi[i].first += add[i];   }   void build(int i, int l, int r) {     if (l == r) {       if (girl[id[l]].begin() == girl[id[l]].end())         mi[i] = make_pair((1e17), (0));       else         mi[i] = *(girl[id[l]].end() - 1);       return;     }     int mid = (l + r) >> 1;     build(i << 1, l, mid);     build(i << 1 | 1, mid + 1, r);     up(i);   }   pair<long long, int> ans;   pair<long long, int> query(int i, int l, int r, int opl, int opr) {     if (l == opl && r == opr) return mi[i];     pair<long long, int> ans;     int mid = (l + r) >> 1;     if (opr <= mid)       ans = query(i << 1, l, mid, opl, opr);     else if (mid < opl)       ans = query(i << 1 | 1, mid + 1, r, opl, opr);     else       ans = min(query(i << 1, l, mid, opl, mid),                 query(i << 1 | 1, mid + 1, r, mid + 1, opr));     ans.first += add[i];     return ans;   }   void work(int i, int l, int r, int pos) {     if (l == r) {       girl[id[l]].pop_back();       if (girl[id[l]].begin() == girl[id[l]].end())         mi[i] = make_pair((1e17), (0));       else         mi[i] = *(girl[id[l]].end() - 1);       mi[i].first += add[i];       return;     }     int mid = (l + r) >> 1;     if (pos <= mid)       work(i << 1, l, mid, pos);     else       work(i << 1 | 1, mid + 1, r, pos);     up(i);   }   int work(int u, int v) {     ans = make_pair((1e17), (0));     while (top[u] != top[v]) {       if (dep[top[u]] < dep[top[v]]) swap(u, v);       ans = min(query(1, 1, n, L[top[u]], L[u]), ans);       u = fa[top[u]];     }     if (dep[u] > dep[v]) swap(u, v);     ans = min(ans, query(1, 1, n, L[u], L[v]));     if (ans.first == 1e17) return -1;     work(1, 1, n, L[c[ans.second]]);     return ans.second;   }   void updata(int i, int l, int r, int opl, int opr, long long k) {     if (l == opl && r == opr) {       add[i] += k;       mi[i].first += k;       return;     }     int mid = (l + r) >> 1;     if (opr <= mid)       updata(i << 1, l, mid, opl, opr, k);     else if (mid < opl)       updata(i << 1 | 1, mid + 1, r, opl, opr, k);     else       updata(i << 1, l, mid, opl, mid, k),           updata(i << 1 | 1, mid + 1, r, mid + 1, opr, k);     up(i);   }   int num, tmp[N];   int main() {     int ty, u, v, k;     scanf( %d%d%d , &n, &m, &q);     for (int i = 1; i < n; i++) {       scanf( %d%d , &u, &v);       addedge(u, v);       addedge(v, u);     }     for (int i = 1; i <= m; i++) {       scanf( %d , &c[i]);       girl[c[i]].push_back(make_pair((i), (i)));     }     dfs1(1, 1);     dfs2(1, 1);     for (int i = 1; i <= n; i++)       sort(girl[i].begin(), girl[i].end(), greater<pair<long long, int> >());     build(1, 1, n);     for (int i = 1; i <= q; i++) {       scanf( %d , &ty);       if (ty == 1) {         scanf( %d%d%d , &u, &v, &k);         num = 0;         while (k--) {           tmp[++num] = work(u, v);           if (tmp[num] == -1) {             num--;             break;           }         }         printf( %d  , num);         for (int i = 1; i <= num; i++) printf( %d  , tmp[i]);         puts(  );       } else {         scanf( %d%d , &u, &k);         updata(1, 1, n, L[u], R[u], k);       }     }     return 0;   }   