Pagini recente » Autentificare | Borderou de evaluare (job #3222461) | Rating Rusu Eliza (ElizaRusu) | Borderou de evaluare (job #2911897) | Cod sursa (job #2230599)
#include <stdio.h>
#include <math.h>
#define NMAX 100001
#define LOG2NMAX 17
int n, m;
int A[NMAX];
int M[NMAX][LOG2NMAX];
int query(int a, int b)
{
int k = log2(b - a + 1);
int x = M[a][k];
int y = M[b - (1 << k) + 1][k];
return (A[x] <= A[y]) ? x : y;
}
int main()
{
// read input
freopen("rmq.in", "r", stdin);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &A[i]);
// precompute index table
for (int i = 1; i <= n; i++)
M[i][0] = i;
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
int x = M[i][j - 1];
int y = M[i + (1 << (j - 1))][j - 1];
M[i][j] = (A[x] < A[y]) ? x : y;
}
// do queries
freopen("rmq.out", "w", stdout);
for (int k = 0; k < m; k++) {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", A[query(a, b)]);
}
return 0;
}