Cod sursa(job #1110600)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 18 februarie 2014 11:24:16
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#define minim(a,b) (a<b)?(a):(b)
using namespace std;

int v[20][100005];
int n,m;

int log(int a) {
    /*int s=0,f=18;
    while (s < f) {
        int mij = (s+f)/2;
        if ((1<<mij) < a) f = mij-1;
        else if ((1<<mij) == a) return mij;
        else if ((1<<(mij+1)) >= a) s = mij+1;
        else return mij;
    }*/
    int k;
    for (k=0;(1<<k+1)<a;k++);
    return k;
}

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