Cod sursa(job #957737)

Utilizator cousin.batmanVaru Batman cousin.batman Data 5 iunie 2013 22:03:10
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include<fstream>
#include<vector>

using namespace std;
int main(){
    int i, p, x, y, n, m, log, min;
    freopen("rmq.in", "rt", stdin);
    freopen("rmq.out", "wt", stdout);

    scanf("%d %d", &n, &m);

    for(log=1; (1<<log)<=n; log++);

    int a[log+1][n+1];

    for(i=1; i<=n; i++)
        scanf("%d", &a[0][i]);

    for(p=1; p<=log; p++){
        for(i=1; i<=n; i++){
            a[p][i] = a[p-1][i];
            if(i+(1<<(p-1))<=n && a[p][i]>a[p-1][i+(1<<(p-1))])
                a[p][i]=a[p-1][i+(1<<(p-1))];
        }
    }

    for(i=1; i<=m; i++){
        scanf("%d %d", &x, &y);
        for(p=0; x-1+(1<<(p+1)) <=y; p++); 

        min = a[p][x];
        if(min>a[p][y-(1<<p)+1])
            min = a[p][y-(1<<p)+1];

        printf("%d\n", min);
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}