Cod sursa(job #1315476)

Utilizator retrogradLucian Bicsi retrograd Data 12 ianuarie 2015 20:46:37
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<fstream>

#define MAXN 100001

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int V[MAXN];
int rmq[200][MAXN], lg[200];


void buildrmq(int V[], int n) {
    for(int i=2; i<=n; i++) {
        lg[i] = lg[i/2] + 1;
    }
   for(int i=1; i<=n; i++) {
        rmq[0][i] = V[i];
   }
   for(int i=1; i<=lg[n]; i++) {
        for(int j=1; j<=n - (1<<i)+1; j++) {
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
        }
   }
}

int ComputeRMQ(int b, int e) {
    int len=e-b+1;
    int i=lg[len];
    return min(rmq[i][b],rmq[i][e - (1<<i) + 1]);
}



int main() {
    int n, q, b, e;
    fin>>n>>q;
    for(int i=1; i<=n; i++) {
        fin>>V[i];
    }
    buildrmq(V, n);
    while(q--) {
        fin>>b>>e;
        fout<<ComputeRMQ(b, e)<<'\n';
    }
}