-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2d_seg_tree.cpp
More file actions
73 lines (66 loc) · 1.65 KB
/
2d_seg_tree.cpp
File metadata and controls
73 lines (66 loc) · 1.65 KB
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
void BuildY(int idX, int lX, int rX, int idY, int lY, int rY){
if (lY==rY){
if (lX==rX){
t[idX][idY] = a[lX][lY];
} else{
t[idX][idY] = (t[idX*2][idY]+ t[idX*2+1][idY]);
}
return;
}
int mid = (lY+rY)/2;
BuildY(idX, lX, rX, idY*2, lY, mid);
BuildY(idX, lX, rX, idY*2+1, mid+1, rY);
t[idX][idY] = (t[idX][idY*2]+ t[idX][idY*2+1]);
}
void BuildX(int id, int l, int r){
if (l==r){
BuildY(id,l,r,1,1,n);
return;
}
int mid = (l+r)/2;
BuildX(id*2, l, mid);
BuildX(id*2+1, mid+1, r);
BuildY(id,l,r,1,1,n);
}
int QueryY(int idX, int id, int l, int r, int L, int R){
if (r<L || R<l) return 0;
if (L<=l && r<=R){
return t[idX][id];
}
int mid = (l+r)/2;
return QueryY(idX,id*2, l, mid, L, R)+ QueryY(idX, id*2+1, mid+1, r, L, R);
}
int Query(int id, int l, int r, int L, int R, int lY, int rY){
if (r < L || R < l) return 0;
if (L<=l && r <=R){
return QueryY(id, 1, 1, n, lY, rY);
}
int mid = (l+r)/2;
return Query(id*2, l, mid, L, R, lY, rY)+Query(id*2+1, mid+1, r, L, R, lY, rY);
}
void UpdateY(int idx, int id, int l, int r, int X, int Y, int val, int lx, int rx){
if (l==r){
if (lx == rx){
t[idx][id] = val;
return;
}
else{
t[idx][id] = t[idx*2][id] + t[idx*2+1][id];
return;
}
}
int mid = (l+r)/2;
if (Y<=mid) UpdateY(idx, id*2, l, mid, X, Y, val, lx, rx);
else UpdateY(idx, id*2+1, mid+1,r,X,Y,val, lx, rx);
t[idx][id] = t[idx][id*2] + t[idx][id*2+1];
}
void UpdateX(int id, int l, int r, int X, int Y, int val){
if (l==r){
UpdateY(id,1,1,n,X,Y,val,l,r);
return;
}
int mid = (l+r)/2;
if (X<=mid) UpdateX(id*2, l, mid, X, Y, val);
else UpdateX(id*2+1, mid+1, r, X, Y, val);
UpdateY(id,1,1,n,X,Y,val,l,r);
}