Cod sursa(job #837818)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 18 decembrie 2012 18:36:25
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<cstdio>
#include<algorithm>

#define Nmax 131072
#define Lmax 18

using namespace std;

int rmq[Lmax][Nmax], log[Nmax], N, M;

int main() {

    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);

    int k, i, a, b, x, y, poz, dif, rez;

    scanf("%d %d",&N,&M);
    for(i=1; i<=N; ++i)
        scanf("%d",&rmq[0][i]);

    log[1] = 0;
    for(i=2; i<=N; i++)
        log[i] = log[i/2] + 1;

    for(k=1; (1<<k)<=N; ++k)
        for(i=1; i+(1<<k)-1<=N; ++i) {
            a = rmq[k-1][i];
            b = rmq[k-1][i+(1<<(k-1))];
            rmq[k][i] = min(a, b);
        }

    for(i=1; i<=M; ++i) {
        scanf("%d %d",&x,&y);
        dif = y-x+1;
        poz = log[dif];
        a = rmq[poz][x];
        b = rmq[poz][y-(1<<poz)+1];
        rez = min(a, b);
        printf("%d\n",rez);
    }

    return 0;
}