Cod sursa(job #1252218)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 30 octombrie 2014 15:57:11
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>
#include <stdlib.h>

#define N_MAX 100000
#define L_MAX 16

inline int min(int a, int b)
{
    return a < b ? a : b;
}
int size(int k)
{
    if (k) {
        return 1 + size(k >> 1);
    } else {
        return 0;
    }
}

int v[N_MAX], loc[L_MAX][N_MAX];

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++) {
        loc[0][i] = v[i];
    }
    for (i = 1; (1 << i) < N; i++) {
        for (j = 0; j + (1 << i) <= N; j++) {
            loc[i][j] = min(loc[i - 1][j], loc[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(loc[width][x - 1], loc[width][y - (1 << width)]);

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