Pagini recente » Cod sursa (job #432014) | Cod sursa (job #1336953) | Cod sursa (job #1490378) | Cod sursa (job #2869200) | Cod sursa (job #1522184)
#include <cstdio>
#include <algorithm>
#define Nmax 100005
using namespace std;
int N,M,K, X, Y;
int D[21][Nmax], lg[Nmax];
FILE *f = freopen("rmq.in", "r", stdin);
FILE *g = freopen("rmq.out", "w", stdout);
inline int min_(int a, int b)
{
if(a > b) return b;
return a;
}
void read()
{
scanf("%d%d", &N, &M); // citire
lg[1] = 0;
for(int i = 2; i<=N; i++)
lg[i] = lg[i / 2] + 1; ///constriuire vector lg pentru apelare ulterioara
for(int i = 1; i<=N; i++)
scanf("%d", &D[0][i]);
}
void solve()
{
for(int i = 1; i<=lg[N]; ++i)
for(int j = 1; j<= N - (1 << (i - 1)); ++j)
D[i][j] = min_(D[i - 1][j], D[i - 1][j + (1 << (i - 1))]); /// construirea matricei pt minime
for(int i = 1; i<=M; i++)
{
scanf("%d%d", &X, &Y);
int K = lg[Y - X + 1]; /// aflarea lui k in O(1)
printf("%d\n", min_(D[K][X], D[K][Y - (1 <<K) + 1])); /// afisarea minimului din intervalul (X, Y)
}
}
int main()
{
read();
solve();
return 0;
}