Cod sursa(job #1252234)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 30 octombrie 2014 16:10:37
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.02 kb
#include <math.h>
#include <stdio.h>

#define MAX_N 1000
#define MAX_LOG 10
#define min(x,y) ((x) < (y) ? (x) : (y))

int n, q, segSize, v[MAX_N], seg[MAX_LOG][MAX_N];

int loga(int x) {
    if (x) {
        return 1 + log(x >> 1);
    } else {
        return -1;
    }
}

int main(void) {
    FILE *fin = fopen("rmq.in", "r");
    FILE *fout = fopen("rmq.out", "w");

    int n, m;
    fscanf(fin, "%d %d\n", &n, &m);

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

    for (i = 0; i < n; i++) {
        seg[0][i] = v[i];
    }
    for (i = 1; (1 << i) < n; i++) {
        for (j = 0; j + (1 << i) <= n; j++) {
            seg[i][j] = min(seg[i - 1][j], seg[i - 1][j + (1 << (i - 1))]);
        }
    }

    for (i = 0; i < m; i++) {
        int x, y;
        fscanf(fin, "%d %d", &x, &y);

        int width = log(y - x + 1);
        int m = min(seg[width][x - 1], seg[width][y - (1 << width)]);

        fprintf(fout, "%d\n", m);
    }
    fclose(fin);
}