1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 #include<iostream>
  5 #include<algorithm>
  6 #define MAXN 100010
  7 #define MAXM 200010
  8 using namespace std;
  9 bool vis[MAXN];
 10 int first[MAXN], second[MAXM], v[MAXM], e;
 11 struct LCT {
 12     int bef[MAXN];
 13     int next[MAXN][2], pre[MAXN], key[MAXN], val[MAXN];
 14     void Init() {
 15         memset(next, 0, sizeof(next));
 16         memset(pre, 0, sizeof(pre));
 17         memset(key, 0, sizeof(key));
 18     }
 19     inline void PushUp(int x) {
 20         val[x] = max(key[x], max(val[next[x][0]], val[next[x][1]]));
 21     }
 22     inline void Rotate(int x, int kind) {
 23         int y, z;
 24         y = pre[x];
 25         z = pre[y];
 26         next[y][!kind] = next[x][kind];
 27         pre[next[x][kind]] = y;
 28         next[z][next[z][1] == y] = x;
 29         pre[x] = z;
 30         next[x][kind] = y;
 31         pre[y] = x;
 32         PushUp(y);
 33     }
 34     void Splay(int x) {
 35         int rt;
 36         for (rt = x; pre[rt]; rt = pre[rt])
 37             ;
 38         if (rt != x) {
 39             bef[x] = bef[rt];
 40             bef[rt] = 0;
 41             while (pre[x]) {
 42                 if (next[pre[x]][0] == x)
 43                     Rotate(x, 1);
 44                 else
 45                     Rotate(x, 0);
 46             }
 47             PushUp(x);
 48         }
 49     }
 50     void Access(int x) {
 51         int father;
 52         for (father = 0; x; x = bef[x]) {
 53             Splay(x);
 54             bef[next[x][1]] = x;
 55             pre[next[x][1]] = 0;
 56             next[x][1] = father;
 57             pre[father] = x;
 58             bef[father] = 0;
 59             father = x;
 60             PushUp(x);
 61         }
 62     }
 63     void Change(int x, int val) {
 64         key[x] += val;
 65         Splay(x);
 66     }
 67     int Query(int x, int y) {
 68         Access(y);
 69         for (y = 0; x; x = bef[x]) {
 70             Splay(x);
 71             if (!bef[x])
 72                 return max(key[x], max(val[next[x][1]], val[y]));
 73             bef[next[x][1]] = x;
 74             pre[next[x][1]] = 0;
 75             next[x][1] = y;
 76             pre[y] = x;
 77             bef[y] = 0;
 78             y = x;
 79             PushUp(x);
 80         }
 81         return 0;
 82     }
 83 } lct;
 84 int INT() {
 85     int res;
 86     char ch;
 87     while (ch = getchar(), !isdigit(ch))
 88         ;
 89     for (res = ch - '0'; ch = getchar(), isdigit(ch);)
 90         res = res * 10 + ch - '0';
 91     return res;
 92 }
 93 char CHAR() {
 94     char res;
 95     while (res = getchar(), !isalpha(res))
 96         ;
 97     return res;
 98 }
 99 inline void AddEdge(int x, int y) {
100     v[e] = y;
101     second[e] = first[x];
102     first[x] = e++;
103 }
104 void BFS(int x) {
105     int i, y;
106     queue<int> q;
107     memset(vis, false, sizeof(vis));
108     vis[x] = true;
109     q.push(x);
110     while (!q.empty()) {
111         x = q.front();
112         q.pop();
113         for (i = first[x]; i != -1; i = second[i]) {
114             y = v[i];
115             if (!vis[y]) {
116                 lct.bef[y] = x;
117                 vis[y] = true;
118                 q.push(y);
119             }
120         }
121     }
122 }
123 int main() {
124     char ch;
125     int n, i, q, x, y;
126     while (~scanf("%d", &n)) {
127         lct.Init();
128         memset(first, -1, sizeof(first));
129         for (e = 0, i = 1; i < n; i++) {
130             x = INT(), y = INT();
131             AddEdge(x, y);
132             AddEdge(y, x);
133         }
134         BFS(1);
135         q = INT();
136         while (q--) {
137             ch = CHAR(), x = INT(), y = INT();
138             if (ch == 'I')
139                 lct.Change(x, y);
140             else
141                 printf("%d\n", lct.Query(x, y));
142         }
143     }
144     return 0;
145 }
posted on 2012-08-23 02:39  DrunBee  阅读(413)  评论(0编辑  收藏  举报