Cod sursa(job #2154012)

Utilizator andrei.gramescuAndrei Gramescu andrei.gramescu Data 6 martie 2018 17:14:52
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
using namespace std;
#define NMAX 100005

int n, m, log2[NMAX], v[NMAX], mat[NMAX][25];

void build(){
    int i, j;
    for(i=1; i<=n; i++)
        mat[i][0] = i;

    for(j=1; j<=log2[n]; j++){
        for(i=1; i<=n; i++){
            if(v[ mat[i][j - 1] ] <= v[ mat[i + (1 << (j-1))][j - 1] ])
                mat[i][j] = mat[i][j - 1];
            else mat[i][j] = mat[i + (1 << (j-1))][j - 1];
        }
    }
}

int rmq(int i, int j){
    int rez, k, l;
    l = j - i + 1;
    k = log2[l];
    if(v[ mat[i][k] ] >= v[ mat[j - l + 2][k] ])
        rez = mat[j - l + 2][k];
    else rez = mat[i][k];

    return rez;
}

int main(){

    log2[0] = -1;
    int i, j, x, y;
    FILE *fin, *fout;
    fin = fopen("rmq.in", "r");
    fout = fopen("rmq.out", "w");

    fscanf(fin, "%d %d", &n, &m);
    for(i=1; i<=n; i++){
        fscanf(fin, "%d ", &v[i]);
        log2[i] = log2[i/2] + 1;
    }

    build();

    for(i=1; i<=m; i++){
        fscanf(fin, "%d %d", &x, &y);
        fprintf(fout, "%d\n", v[ rmq(x, y) ]);
    }

    return 0;
}