Pagini recente » Cod sursa (job #2567511) | Cod sursa (job #2821213) | Cod sursa (job #1624621) | Cod sursa (job #3253762) | Cod sursa (job #2566178)
#include <bits/stdc++.h>
#define MAXN 200005
#define LOG2 20
#define FILENAME std::string("rmq")
std::ifstream input (FILENAME+".in");
std::ofstream output(FILENAME+".out");
int N, M;
int V[MAXN];
int logtable[MAXN];
int RMQ[LOG2][MAXN];
void computeRMQ() {
for (int i=2; i<MAXN; ++i) logtable[i] = logtable[i/2]+1;
for (int i=1; i<=N; ++i) RMQ[0][i] = V[i];
for (int i=1; i<LOG2; ++i)
for (int j=1, k=(1<<i); k<=N; ++j, ++k)
RMQ[i][j] = std::min(RMQ[i-1][j], RMQ[i-1][j+(1<<(i-1))]);
}
int query(int x, int y) {
if (x > y) std::swap(x, y);
int len = y-x+1;
if (len == 1) return V[x];
int logval = logtable[len]-1;
return std::min(RMQ[logval][x], RMQ[logval][y-(1<<logval)+1]);
}
int main()
{
input >> N >> M;
for (int i=1; i<=N; ++i) input >> V[i];
computeRMQ();
for (int i=1, x, y; i<=M; ++i)
input >> x >> y, output << query(x, y) << '\n';
return 0;
}