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