Pagini recente » Cod sursa (job #2713077) | Cod sursa (job #2537268) | Cod sursa (job #2576766) | Cod sursa (job #457844) | Cod sursa (job #1591488)
#include <fstream>
#define NMax 100010
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, queries, elem[NMax], lg[NMax], RMQ[17][NMax];
int getMin(int a, int b)
{
if (a < b)
return a;
return b;
}
void preprocess()
{
for (int i = 2; i <= n; i++)
lg[i] = lg[i / 2] + 1;
for (int i = 1; i <= lg[n]; i++) {
for (int j = 1; j <= n - (1 << i) + 1; j++) {
if (elem[RMQ[i - 1][j]] < elem[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))];
}
}
}
int main()
{
f >> n >> queries;
for (int i = 1; i <= n; i++) {
f >> elem[i];
RMQ[0][i] = i;
}
preprocess();
int a, b;
for (int i = 1; i <= queries; i++) {
f >> a >> b;
int line = lg[b - a + 1];
if (elem[RMQ[line][a]] < elem[RMQ[line][b - (1 << line) + 1]])
g << elem[RMQ[line][a]] << "\n";
else
g << elem[RMQ[line][b - (1 << line) + 1]] << "\n";
}
}