-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMerge Sort Tree.cpp
More file actions
80 lines (64 loc) · 1.86 KB
/
Merge Sort Tree.cpp
File metadata and controls
80 lines (64 loc) · 1.86 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
74
75
76
77
78
79
80
/*This snippet is a merge sort tree which queries on how many values are less than a particular value. */
const int N=100000+50;
vector <int> seg[400000+50];
int lessthan(int val,vector <int> &arr){
return lower_bound(arr.begin(),arr.end(),val)-arr.begin();
}
void build(int node,int l,int r){
if(l==r){
// cout<<node<<" : "<<a[l]<<"\n";
seg[node].push_back(p[l]);
return;
}
int mid=(l+r)/2;
build(2*node+1,l,mid);
build(2*node+2,mid+1,r);
int i=0,j=0;
int n=seg[2*node+1].size();
int m=seg[2*node+2].size();
while(i<n&&j<m){
if(seg[2*node+1][i]<seg[2*node+2][j]){
seg[node].push_back(seg[2*node+1][i]);
i++;
}
else{
seg[node].push_back(seg[2*node+2][j]);
j++;
}
}
while(i<n){
seg[node].push_back(seg[2*node+1][i]);
i++;
}
while(j<m){
seg[node].push_back(seg[2*node+2][j]);
j++;
}
}
int query(int node,int l,int r,int ql,int qr,int val){
// cout<<"l = "<<l<<" , r = "<<r<<" , ql= "<<ql<<" , qr = "<<qr<<"\n";
if(l==r){
if(ql<=l&&qr>=r){
// cout<<"1st return value = "<<seg[node]<<"\n";
// cout<<"When "<<"l = "<<l<<" , r = "<<r<<" , ql= "<<ql<<" , qr = "<<qr<<"\n";
return lessthan(val,seg[node]);
}
else{
return 0;
}
}
//full overlap
if(ql<=l&&qr>=r){
// cout<<"2nd return value = "<<seg[node]<<"\n";
// cout<<"When "<<"l = "<<l<<" , r = "<<r<<" , ql= "<<ql<<" , qr = "<<qr<<"\n";
return lessthan(val,seg[node]);
}
else if(qr<l||ql>r){
// cout<<"ni/gga\n";
return 0;
}
int mid=(l+r)/2;
int le=query(2*node+1,l,mid,ql,qr,val);
int ri=query(2*node+2,mid+1,r,ql,qr,val);
return le+ri;
}