Pagini recente » Cod sursa (job #2048377) | Cod sursa (job #1153931) | Cod sursa (job #384106) | Cod sursa (job #48181) | Cod sursa (job #2901229)
#include <iostream>
#include <fstream>
using namespace std;
int pm[100001][20], a[100000], log2[100000], n;
void rmq(int n)
{
int i, j;
for (i = 0; i < n; i++)
pm[i][0] = i;
for (j = 1; 1 << j <= n; j++)
for (i = 0; i + (1 << j) - 1 < n; i++)
if (a[pm[i][j - 1]] < a[pm[i + (1 << (j - 1))][j - 1]]) pm[i][j] = pm[i][j - 1];
else pm[i][j] = pm[i + (1 << (j - 1))][j - 1];
}
void log(int n)
{
int lg = -1, p = 1, i;
for(i = 1; i <= n; i++)
{
if(p == i)
{
log2[i] = ++lg;
p *= 2;
}
else log2[i] = lg;
}
}
int main()
{int i, m, x, y, k;
ifstream f("rmq.in");
ofstream g("rmq.out");
f >> n >> m;
for(i = 0; i < n; i++)
f >> a[i];
rmq(n);
log(n);
for(i = 0; i < m; i++)
{
f >> x >> y;
x--;
y--;
k = log2[y - x + 1];
if(a[pm[x][k]] < a[pm[y - (1 << k) + 1][k]])
g << a[pm[x][k]] << '\n';
else g << a[pm[y - (1 << k) + 1][k]] << '\n';
}
return 0;
}