Cod sursa(job #1140975)

Utilizator swim406Teudan Adina swim406 Data 12 martie 2014 13:54:37
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define NMAX 100001

using namespace std;

int mat[NMAX][18];


int main() {
    freopen ("rmq.in", "r", stdin);
    freopen ("rmq.out", "w", stdout);
    int N, M, i, j, v[NMAX], x, y;
    scanf ("%d %d", &N, &M);
    for (i = 1; i <= N; ++i)
        scanf ("%d", &v[i]);
    ++M;
    for (i = 1; i <= N; ++i)
        mat[i][0] = i;
    for (j = 1; 1<<j <= N; ++j)
        for (i = 1; i + (1 << j) - 1 <= N; ++i)
            if (v[mat[i][j - 1]] < v[mat[i + (1 << (j - 1))][j - 1]])
                mat[i][j] = mat[i][j-1];
            else mat[i][j] = mat[i + (1 <<(j-1))][j-1];
    while (--M) {
        scanf ("%d %d", &x, &y);
        int k = log (y - x + 1);
        printf ("%d\n", min(v[mat[x][k]], v[mat[y - (1<<k) + 1][k]]));
    }
    return 0;
}