Cod sursa(job #2368346)

Utilizator Valentin0709Datcu George Valentin Valentin0709 Data 5 martie 2019 15:38:20
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#include <math.h>
using namespace std;

#define NMAX 100005

FILE * f = fopen("rmq.in", "r");
FILE * g = fopen("rmq.out", "w");

int n, m, i, x, y;
int v[NMAX], s[NMAX][(int)log2(NMAX)];

void precalc() {
    int i, j, l = 1;

    for(i = 1; i <= n; i++) s[i][0] = i;
    for(j = 1; l <= n; j++) {
        l *= 2;
        for(i = 1; i + l - 1 <= n; i++) {
            if(v[s[i][j - 1]] < v[s[i + l/2][j - 1]]) s[i][j] = s[i][j - 1];
            else s[i][j] = s[i + l/2][j - 1];
        }
    }
}

int rmq(int x, int y) {
    int k = log2(y - x + 1);

    if(v[s[x][k]] < v[s[y - (1 << k) + 1][k]]) return v[s[x][k]];
    return v[s[y - (1 << k) + 1][k]];
}

int main() {

    fscanf(f, "%d%d", &n, &m);
    for(i = 1; i <= n; i++) fscanf(f, "%d", &v[i]);

    precalc();

    for(i = 1; i <= m; i++) {
        fscanf(f, "%d%d", &x, &y);
        fprintf(g, "%d\n", rmq(x, y));
    }

    fclose(f); fclose(g);

    return 0;
}