Pagini recente » Cod sursa (job #1077048) | Cod sursa (job #2168656) | Cod sursa (job #1262148) | Cod sursa (job #1089061) | Cod sursa (job #1489549)
#include <fstream>
#include <cmath>
using namespace std;
const int maxN = 100000;
void process(int a[], int dp[][maxN], int N)
{
int i, j;
for (i = 0; i < N; i++)
dp[0][i] = a[i];
for (i = 1; i <= (int)log(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, int 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];
int dp[(int)log(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();
}