Pagini recente » Cod sursa (job #2153168) | Cod sursa (job #1134696) | Cod sursa (job #241593) | Cod sursa (job #1372263) | Cod sursa (job #1489557)
#include <fstream>
#include <cmath>
#include <cassert>
#include <iostream>
using namespace std;
const int maxN = 100000;
void process(int a[], short dp[][maxN], int N)
{
int i, j;
for (i = 0; i < N; i++)
dp[0][i] = a[i];
for (i = 1; i <= (int)(log2(N)); i++)
for (j = 0; j + (1 << (i - 1)) < N; j++)
dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);
}
int query(int x, int y, short dp[][maxN], int N)
{
int k = 0;
x--, y--;
while ((1 << (k + 1)) <= (y - x))
k++;
return min(dp[k][x], dp[k][y - (1 << k) + 1]);
}
int main()
{
int N, M, i;
ifstream f("rmq.in");
f >> N >> M;
int a[N];
for (i = 0; i < N; i++)
f >> a[i];
short dp[(int)(log2(N)) + 1][maxN];
process(a, dp, N);
int x, y;
ofstream g("rmq.out");
for (i = 0; i < M; i++)
{
f >> x >> y;
g << query(x, y, dp, N) << '\n';
}
f.close();
g.close();
}