Cod sursa(job #1512762)

Utilizator mariusn01Marius Nicoli mariusn01 Data 28 octombrie 2015 16:40:45
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#define DIM 100010

using namespace std;

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

int mySwap(int &x, int &y) {
    int aux =x;
    x = y;
    y = aux;
}

int p[20];
int L[DIM];
int D[18][DIM];

int n, m, i, j, x, y, e;

int main () {
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>D[0][i];
    // calculez p[i] = 2 la puterea i
    p[0] = 1;
    for (i=1; p[i-1] <= n; i++)
        p[i] = p[i-1] * 2;

    for (i=1;p[i]<=n;i++)
        for (j=1;j<=n;j++) {
            // D[i][j] = minimul din secventa de lunfime p[i]
            // ce incepe la pozitia j

            D[i][j] = D[i-1][j];
            if (j + p[i-1] <= n)
                D[i][j] = min(D[i][j], D[i-1][j+p[i-1]]);
        }

    // calculam Log[i] = exponentul celei mai mare putere de 2 <= i
    L[1] = 0;
    for (i=2;i<=n;i++)
        L[i] = 1 + L[i/2];

    for (i=1;i<=m;i++) {
        fin>>x>>y;
        if (x > y) {
            mySwap(x, y);
        }

        e = L[y-x+1];

        fout<<min(D[e][x], D[e][y-p[e]+1])<<"\n";
    }

    return 0;
}