Cod sursa(job #1644510)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 9 martie 2016 23:46:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
# include <cstdio>

using namespace std;

FILE *fin = fopen("rmq.in", "rt");
FILE *fout = fopen("rmq.out", "wt");

const int MAXN = 100005;
const int LOGN = 17;
int v[MAXN];
int rmq[LOGN][MAXN];
int kmax[MAXN];
int n, m, a, b;
int i, j, k;

int main() {
    fscanf(fin, "%d%d", &n, &m);
    for (i=1; i<=n; ++i) {
        fscanf(fin, "%d", &v[i]);
        rmq[0][i] = i;
    }

    // D[i][j] = minimul incepand cu pozitia j a primelor 2^i elemente
    for (i=1; (1<<i)<=n; ++i)
        for (j=1; j+(1<<i)-1<=n; ++j) {
            k = (1<<(i-1));
            if (v[rmq[i-1][j]] < v[rmq[i-1][j+k]])
                rmq[i][j] = rmq[i-1][j];
            else
                rmq[i][j] = rmq[i-1][j+k];
        }

    // k maxim a.i. 2^k < b-a
    kmax[2] = 1;
    for (i=3; i<=n; ++i)
        kmax[i] = 1 + kmax[i/2];

    for (i=1; i<=m; ++i) {
        fscanf(fin, "%d%d", &a, &b);

        k = kmax[(b-a+1)];
        j = b-(1<<k)+1;

        if (v[rmq[k][a]] < v[rmq[k][j]])
            fprintf(fout, "%d\n", v[rmq[k][a]]);
        else
            fprintf(fout, "%d\n", v[rmq[k][j]]);
    }
    return 0;
}