-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathRMQ v2.cpp
34 lines (29 loc) · 842 Bytes
/
RMQ v2.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
# include <fstream>
# include <algorithm>
# define NMAX 100005
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int i,j,n,m,x,y,k,Q,LG,ci,cs;
int RMQ[20][NMAX], lg[NMAX];
int main ()
{
f>>n>>Q;
for (i=1; i<=n; ++i)
f>>RMQ[0][i];
for (i=2; i<=n; ++i)
lg[i]=lg[i/2]+1;
for (i=1; i<=lg[n]; ++i) {
for (j=1; j<=n-(1<<(i-1))+1; ++j)
if (RMQ[i-1][j] < RMQ[i-1][j+(1<<(i-1))]) RMQ[i][j]=RMQ[i-1][j];
else RMQ[i][j]=RMQ[i-1][j+(1<<(i-1))];
}
for (i=1; i<=Q; ++i){
f>>ci>>cs;
if (ci > cs) swap(ci, cs);
LG=lg[cs-ci+1];
if (RMQ[LG][ci] < RMQ[LG][cs-(1<<LG)+1]) g<<RMQ[LG][ci]<<"\n";
else g<<RMQ[LG][cs-(1<<LG)+1]<<"\n";
}
return 0;
}