-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmerge_sort_tree.cpp
More file actions
49 lines (39 loc) · 1.08 KB
/
merge_sort_tree.cpp
File metadata and controls
49 lines (39 loc) · 1.08 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
#define lim 200010
//////////////// Merge Sort Tree //////////////////////////
LL arr[lim ];
vector < LL > tree[4 * lim];
void merge_sort(LL node, LL a, LL b) {
if (a == b) {
tree[node].pb(arr[a]);
return;
}
LL mid = (a + b) / 2 , left, right;
left = node * 2 ; right = left + 1;
merge_sort( left, a, mid);
merge_sort( right, mid + 1, b);
merge( tree[left].begin() , tree[left].end() , tree[right].begin(), tree[right].end(), back_inserter(tree[node]));
}
LL BS( LL node, LL val ){
LL l = 0 , r = tree[node].size()-1 , m;
LL ret = 0;
while(l<=r){
m = (l+r)/2;
if( tree[node][m] <= val ){
ret = m+1;
l = m+1;
}
else r = m-1;
}
return tree[node].size()-ret;
}
LL query(LL node, LL a, LL b, LL i, LL j, LL val) {
if ( a > j || b < i ) return 0;
if ( i <= a && b <= j ) {
if ( tree[node].size() )
return BS( node, val );
return 0;
}
LL left = (node<<1) , right = left + 1 , mid = ((a+b)/2);
return query(left,a,mid,i,j,val) + query( right, mid+1,b,i,j,val );
}
//////////////// Merge Sort Tree END //////////////////////////