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
|
import java.util.*;
class Solution {
static class BIT {
long[] t;
int n;
BIT(int sz) { t = new long[sz+2]; n = sz+2; }
void add(int i, long v) { for (; i < n; i += i&-i) t[i] += v; }
long sum(int i) { long r=0; for (; i>0; i -= i&-i) r += t[i]; return r; }
void range(int l, int r, long v) { add(l, v); add(r+1, -v); }
}
public List<Integer> shortestPath(int n, int[][] edges, int[][] queries) {
List<int[]>[] g = new List[n+1];
for (int i=0; i<=n; ++i) g[i]=new ArrayList<>();
Map<String,Integer> edgeIdx = new HashMap<>();
int[] eid = new int[n+1], parent = new int[n+1], in = new int[n+1], out = new int[n+1], weight = new int[n];
for (int i=0; i<edges.length; ++i) {
int u=edges[i][0], v=edges[i][1], w=edges[i][2];
g[u].add(new int[]{v,w}); g[v].add(new int[]{u,w});
edgeIdx.put(u+","+v, i); edgeIdx.put(v+","+u, i);
weight[i]=w;
}
int[] time = {1};
dfs(1,0,g,parent,eid,edgeIdx,in,out,time);
BIT bit = new BIT(n+2);
for (int v=2; v<=n; ++v) bit.range(in[v], in[v], weight[eid[v]]);
List<Integer> ans = new ArrayList<>();
for (int[] q:queries) {
if (q[0]==1) {
int u=q[1], v=q[2], w=q[3];
int ch = parent[u]==v?u:v;
int idx = eid[ch];
int diff = w-weight[idx];
bit.range(in[ch], out[ch], diff);
weight[idx]=w;
} else {
int x=q[1];
ans.add((int)bit.sum(in[x]));
}
}
return ans;
}
static void dfs(int u, int p, List<int[]>[] g, int[] parent, int[] eid, Map<String,Integer> edgeIdx, int[] in, int[] out, int[] time) {
in[u]=time[0]++;
for (int[] vw:g[u]) if (vw[0]!=p) {
parent[vw[0]]=u;
eid[vw[0]]=edgeIdx.get(u+","+vw[0]);
dfs(vw[0],u,g,parent,eid,edgeIdx,in,out,time);
}
out[u]=time[0]-1;
}
}
|