Pagini recente » Cod sursa (job #1563197) | Cod sursa (job #212301) | Cod sursa (job #868805) | Cod sursa (job #672406) | Cod sursa (job #672952)
Cod sursa(job #672952)
#include <stdio.h>
#include <math.h>
int a[100000];
int m[100000][18];
// we initialize m[i][j] tp hold the min in interval [i, i + 2 ^j]
void initialize(int n)
{
for (int i = 0; i < n; i++)
m[i][0] = i;
for (int j = 1; (1 << j) <= n; j++) {
for (int i = 0; (i + (1 << j) - 1) < n; i++) {
int a1 = a[m[i][j - 1]];
int a2 = a[m[i + (1 << (j - 1))][j - 1]];
m[i][j] = (a1 < a2) ? m[i][j - 1] : m[i + (1 << (j - 1))][j - 1];
}
}
}
// Query for the min in [x, y] through <node>
int query(int i, int j)
{
int k = log(j - i + 1) / log(2);
int a1 = a[m[i][k]];
int a2 = a[m[j - (1 << k) + 1][k]];
return (a1 < a2) ? m[i][k] : m[j - (1 << k) + 1][k];
}
int main()
{
int n, m;
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d\n", &a[i]);
initialize(n);
for (int i = 0; i < m; i++) {
int x, y;
scanf("%d %d\n", &x, &y);
printf("%d\n", a[query(x - 1, y - 1)]);
}
return 0;
}