Cod sursa(job #1818030)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 28 noiembrie 2016 19:17:22
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int rmq[17][100005];
int lg2[100005];
int pow2[17];

int main() {
    int i,j,n,q,limit,lf,rg;
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    scanf("%d %d", &n, &q);
    lg2[2] = 1;
    for(i = 3;i <= n;i++){
        lg2[i] = lg2[i>>1] + 1;
    }
    pow2[0] = 1;
    for(i = 1;i <= lg2[n];i++){
        pow2[i] = pow2[i-1]<<1;
    }
    for(i = 1;i <= n;i++){
        scanf("%d", &rmq[0][i]);
    }
    for(j = 1;j <= lg2[n];j++){
        limit = n - ((1<<j) - 1);
        for(i = 1;i <= limit;i++){
            rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i + pow2[j-1]]);
        }
    }
    for(i = 1;i <= q;i++){
        scanf("%d %d", &lf, &rg);
        limit = lg2[rg - lf + 1];
        printf("%d\n", min(rmq[limit][lf], rmq[limit][rg - pow2[limit] + 1]));
    }
    return 0;
}