Skip to content

Commit 7a5fa6b

Browse files
Merge pull request matthewsamuel95#269 from ThiagoWhispher/patch-2
Created Segment Tree and LCA
2 parents 84ae4c6 + 29c5a11 commit 7a5fa6b

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

Data Structures/LCA/lca.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include <stdio.h>
2+
#include <vector>
3+
using namespace std;
4+
#define max 100
5+
#define lg_max 7
6+
vector<int> graph[max];
7+
int parent[max][lg_max], level[max], lg[max];
8+
int n;
9+
void log(){
10+
for(int i=2; i<max; i++) lg[i] = lg[i/2] + 1;
11+
}
12+
void dfs(int u, int p){
13+
for(auto v: graph[u]){
14+
if(v != p){
15+
level[v] = level[u] + 1;
16+
parent[v][0] = u;
17+
dfs(v,u);
18+
}
19+
}
20+
}
21+
void build(){
22+
for(int j=1; j<=lg[n]; j++){
23+
for(int i=1; i<=n; i++){
24+
parent[i][j] = parent[parent[i][j-1]][j-1];
25+
}
26+
}
27+
}
28+
int lca(int u, int v){
29+
if(level[u] < level[v]) return lca(v, u);
30+
for(int i=lg[n]; i>=0; i--){
31+
if(level[u] - (1<<i) >= level[v]){
32+
u = parent[u][i];
33+
}
34+
}
35+
if(u == v) return u;
36+
for(int i=lg[n]; i>=0; i--){
37+
if(parent[u][i] != parent[v][i]){
38+
u = parent[u][i];
39+
v = parent[v][i];
40+
}
41+
}
42+
return parent[u][0];
43+
}
44+
int main(){
45+
log();
46+
int x, y;
47+
scanf("%d", &n);
48+
for(int i=0; i<n-1; i++){
49+
scanf("%d%d", &x, &y);
50+
graph[x].push_back(y);
51+
graph[y].push_back(x);
52+
}
53+
dfs(1,1);
54+
build();
55+
scanf("%d%d", &x, &y);
56+
printf("%d\n", lca(x, y));
57+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include <stdio.h>
2+
3+
using namespace std;
4+
5+
#define MAX (int)10e6
6+
7+
int values[MAX], tree[MAX * 4];
8+
9+
int read(int id, int l, int r, int x, int y){
10+
if(l > y || r < x) return 0;
11+
else{
12+
if(l >= x && r <= y) return tree[id];
13+
else{
14+
int mid = (l+r)/2;
15+
int q1 = read(id*2, l, mid, x, y);
16+
int q2 = read(id*2+1, mid+1, r, x, y);
17+
return q1 + q2;
18+
}
19+
}
20+
}
21+
22+
void update(int id, int l, int r, int p, int value){
23+
if(l == r) tree[id] = value;
24+
else{
25+
int mid = (l+r)/2;
26+
if(p <= mid) update(id*2, l, mid, p, value);
27+
else update(id*2+1, mid+1, r, p, value);
28+
tree[id] = tree[id*2] + tree[id*2+1];
29+
}
30+
}
31+
32+
void build(int id, int l, int r){
33+
if(l == r) tree[id] = values[l];
34+
else{
35+
int mid = (l+r)/2;
36+
build(id*2, l, mid);
37+
build(id*2+1, mid+1, r);
38+
tree[id] = tree[id*2] + tree[id*2+1];
39+
}
40+
}
41+
42+
int main(){
43+
int n, q, x, y, opc;
44+
scanf("%d %d", &n, &q);
45+
for(int i=1; i<=n; i++) scanf("%d", &values[i]);
46+
build(1, 1, n);
47+
while(q--){
48+
scanf("%d %d %d", &opc, &x, &y);
49+
if(opc == 1){ //read
50+
printf("%d\n", read(1, 1, n, x, y));
51+
}else{ //update
52+
update(1, 1, n, x, y);
53+
}
54+
}
55+
return 0;
56+
}

0 commit comments

Comments
 (0)