Pagini recente » Cod sursa (job #2704372) | Cod sursa (job #852548) | Cod sursa (job #2791005) | Cod sursa (job #192630) | Cod sursa (job #972037)
Cod sursa(job #972037)
#include <fstream>
using namespace std;
#define MAXN 100005
int RMQ[20][MAXN<<1], Lg[MAXN], a[MAXN], n, m;
int Query(int x, int y){
int diff = y - x + 1;
int l = Lg[diff];
int sh = diff - ( 1<<l );
int Ans = RMQ[l][x];
if(a[Ans] > a[RMQ[l][x+sh]])
Ans = RMQ[l][x+sh];
return a[Ans];
}
inline void Build_RMQ(){
for(int i = 1 ; i <= n ; ++ i)
RMQ[0][i] = i;
for(int i = 1 ; (1<<i) <= n ; ++ i)
for(int j = 1 ; j <= n - ( 1 << i ) ; ++ j){
int l = 1<<(i-1);
if(a[RMQ[i-1][j]] > a[RMQ[i-1][j+l]])
RMQ[i][j] = RMQ[i-1][j+l];
else RMQ[i][j] = RMQ[i-1][j];
}
}
inline void Build_Log(){
for(int i = 2 ; i <= n ; ++ i)
Lg[i] = Lg[(i>>1)] + 1;
}
int main() {
ifstream in("rmq.in");
ofstream out("rmq.out");
in >> n >> m;
for(int i = 1 ; i <= n ; ++ i)
in >> a[i];
Build_Log();
Build_RMQ();
for(int i = 1 ; i <= m ; ++ i){
int x, y;
in >> x >> y;
out << Query(x, y) << "\n";
}
in.close();
out.close();
return 0;
}