Cod sursa(job #1087028)

Utilizator marinMari n marin Data 18 ianuarie 2014 20:28:38
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#define DIMN 100010
#define DIMM 1000010

using namespace std;

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

int L[DIMN], V[DIMN];
int n, i, x, y, len, j, m;
int D[20][DIMN];
//D[i][j] minimul din secventa de lungime 2^i ce incepe la pozitia j

int minim(int a, int b) {
    if (a < b)
        return a;
    else
        return b;
}

int main() {
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>V[i];


    L[1] = 0;
    for (i=2;i<=n;i++)
        L[i] = 1 + L[i/2];

    for (j=1;j<=n;j++)
        D[0][j] = V[j];
    for (i=1;(1<<i)<=n;i++) {
        for (j=1;j<=n;j++) {
            D[i][j] = D[i-1][j];
            if (j + (1<<(i-1))<=n && D[i][j] > D[i-1][j + (1<<(i-1))])
                D[i][j] = D[i-1][j + (1<<(i-1))];
        }
    }

    while (m) {
        fin>>x>>y;
        len = L[y-x+1];
        fout<<minim(D[len][x], D[len][y-(1<<len)+1])<<"\n";
        m--;
    }

    return 0;
}