-
Notifications
You must be signed in to change notification settings - Fork 1
/
Mergesort_tree.cpp
115 lines (81 loc) · 1.59 KB
/
Mergesort_tree.cpp
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include<bits/stdc++.h>
typedef int LL;
using namespace std;
const int M = 1000000007;
const int N=400001;
LL n;
vector <LL> v;
vector <LL> tree[N];
void build(LL x,LL l,LL r)
{ LL m= (l+r) >> 1;
if(l<r)
{
build(2*x,l,m);
build(2*x+1,m+1,r);
tree[x].resize(tree[2*x].size()+tree[2*x+1].size());
merge(tree[2*x].begin(),tree[2*x].end(),tree[2*x+1].begin(),tree[2*x+1].end(),tree[x].begin());
}
else
tree[x].push_back(v[l]);
}
LL get(LL x,LL l,LL r,LL ll,LL rr,LL k)
{
LL m= (l+r) >> 1;
if (ll<=l && r<=rr)
return lower_bound(tree[x].begin(),tree[x].end(),k) - tree[x].begin();
else if (r<ll || l>rr)
return 0;
else
return get(2*x,l,m,ll,rr,k) + get(2*x+1,m+1,r,ll,rr,k);
}
LL getl(LL x,LL l,LL r,LL ll,LL rr,LL k)
{
LL m= (l+r) >> 1;
vector <LL> :: iterator it;
if (ll<=l && r<=rr)
{
it= lower_bound(tree[x].begin(),tree[x].end(),k);
if(it!=tree[x].end())
return *it;
else
return M;
}
else if (r<ll || l>rr)
return M;
else
return min(getl(2*x,l,m,ll,rr,k) , getl(2*x+1,m+1,r,ll,rr,k) );
}
LL getk(LL a,LL b,LL c)
{
LL l=0,h=n-1;
LL m;
while(l<h)
{
m=(l+h)>>1;
LL d=get(1,0,n-1,a,b,tree[1][m]);
//cout<<l<<' '<<h<<' '<<m<<' '<<tree[1][m]<<' '<<d<<endl;
if(c>d)
l=m+1;
else
h=m;
}
//cout<<"YO"<<endl;
//cout<<l+1<<' '<<tree[1][l]<<endl;
return getl(1,0,n-1,a,b,tree[1][l]);
}
int main()
{
LL i,m,a,b,c,A=0;
cin>>n>>m;
v.resize(n);
for(i=0;i<n;i++)
scanf("%d",&v[i]);
build(1,0,n-1);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
a--;b--;c--;
A=getk(a,b,c);
printf("%d\n",A);
}
}