Pagini recente » Cod sursa (job #2443146) | Rating alexandru chirila (ales) | Cod sursa (job #2214506) | Cod sursa (job #2839118) | Cod sursa (job #1959741)
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 100005;
int n, m;
int mat[N][25];
void citire()
{
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%d", &mat[i][0]);
}
}
void umplere()
{
int lg = log2(n);
for(int i = 1; i <= lg; i++)
{
for(int j = 0; j < n; j++)
{
if(j + (1 << (i - 1)) < n)
{
mat[j][i] = min(mat[j][i - 1], mat[j + (1 << (i - 1))][i - 1]);
}
else
{
mat[j][i] = mat[j][i - 1];
}
}
}
}
void afisareMat()
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < 20; j++)
{
printf("%d ", mat[i][j]);
}
printf("\n");
}
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
citire();
umplere();
//afisareMat();
int poz1, poz2;
for(int k = 0; k < m; k++)
{
scanf("%d %d", &poz1, &poz2);
poz1--;
poz2--;
if(poz1 > poz2)
{
swap(poz1, poz2);
}
int nr = poz2 - poz1 + 1;
int lg = log2(nr);
printf("%d\n", min(mat[poz1][lg], mat[poz2 - (1 << lg) + 1][lg]));
}
return 0;
}