Skip to content

Commit b387c78

Browse files
committed
added persistent sement trees + ST on maps
1 parent d76602e commit b387c78

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
2+
// query l to r range for the no of integers between x and y
3+
#include <iostream>
4+
using namespace std;
5+
int T = 1;
6+
const int N = 1e6;
7+
const int MX = N;
8+
struct node{
9+
int l, r, cnt;
10+
}t[100*MX];
11+
int root[N], a[N];
12+
int build(int lo, int hi){
13+
int id = T++;
14+
if(lo == hi) return id;
15+
int mid = (lo+hi)/2;
16+
t[id].l = build(lo, mid);
17+
t[id].r = build(mid+1, hi);
18+
return id;
19+
}
20+
int update(int rt, int lo, int hi, int val){
21+
int id = T++;
22+
t[id] = t[rt]; t[id].cnt++;
23+
if(lo == hi) return id;
24+
int mid = (lo+hi)/2;
25+
if(val <= mid) t[id].l = update(t[rt].l, lo, mid, val);
26+
else t[id].r = update(t[rt].r, mid+1, hi, val);
27+
return id;
28+
}
29+
int query(int rt, int lo, int hi, int x, int y){
30+
if(x==lo and y==hi) return t[rt].cnt;
31+
int mid = (lo+hi)/2;
32+
if(y <= mid) return query(t[rt].l, lo, mid, x, y);
33+
else if (x > mid) return query(t[rt].r, mid+1, hi, x, y);
34+
return query(t[rt].l, lo, mid, x, mid) + query(t[rt].r, mid+1, hi, mid+1, y);
35+
}
36+
int main() {
37+
int i, n, q;
38+
cin >> n >> q;
39+
for(i = 0; i < n; i++) cin >> a[i+1];
40+
root[0] = build(0, MX);
41+
for(i = 1; i <= n; i++){
42+
root[i] = update(root[i-1], 0, MX, a[i]);
43+
}
44+
while(q--){
45+
int l, r, x, y;
46+
cin >> l >> r >> x >> y;
47+
cout << query(root[r], 0, MX, x, y) - query(root[l-1], 0, MX, x, y) << endl;
48+
}
49+
return 0;
50+
}

Library/DS/segment_tree_on_map.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
const int N = 2e6;
4+
map<int, long long> my[N];
5+
void update(int st, int lo, int hi, int pos, int val){
6+
my[st][val]++;
7+
if(lo == hi){
8+
return;
9+
}
10+
int l = 2*st, r = l+1, mid = (lo+hi)/2;
11+
if(pos>mid) update(r, mid+1, hi, pos, val);
12+
else update(l, lo, mid, pos, val);
13+
}
14+
long long query(int st, int lo, int hi, int x, int y, int val){
15+
if(lo == x and hi == y){
16+
return my[st][val];
17+
}
18+
int l = 2*st, r = l+1, mid = (lo+hi)/2;
19+
if(x>mid) return query(r, mid+1, hi, x, y, val);
20+
else if(y<=mid) return query(l, lo, mid, x, y, val);
21+
return query(l ,lo , mid, x, mid, val) + query(r, mid+1, hi, mid+1, y, val);
22+
}
23+
24+
int main() {
25+
int n, i, q, k, l, t, r;
26+
cin >> n >> q;
27+
while(q--){
28+
cin >> t >> l >> r;
29+
if(t == 1){
30+
//add l to a[r]
31+
update(1, 0, n-1, r-1, l);
32+
}
33+
else{
34+
//count of k from a[l] to a[r].
35+
cin >> k;
36+
cout << query(1, 0, n-1, l-1, r-1, k) << endl;
37+
}
38+
}
39+
return 0;
40+
}

0 commit comments

Comments
 (0)