Cod sursa(job #1977867)

Utilizator rusuraresRares Rusu rusurares Data 6 mai 2017 12:58:45
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#include <stdlib.h>

int v[100001];
int r[100001][17];
int log[100001];

int min( int a, int b ) {
    if(a>b)
        return b;
    return a;
}

int query( int a, int b ) {
    int l = log[b - a + 1];
    return min( r[a + ( 1 << l ) - 1][l], r[b][l] );
}

int main() {


    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n, m, i, j, a, b;
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;i++)
        scanf("%d", &v[i]);
    for (i=1;i<=n;i++)
    {
        r[i][0]=v[i];
        for (j=1;(1<<j)<=i;j++)
        {
            r[i][j] = min(r[i-(1<<(j-1))][j-1], r[i][j-1]);
        }
    }
    log[1]=0;
    for (i=2;i<=n;i++)
    {
        log[i] = 1 + log[i / 2];
    }
    for ( i = 0; i < m; i++ ) {
        scanf("%d%d",&a,&b);
        printf("%d\n",query(a,b));
    }
    return 0;
}