Cod sursa(job #1869126)

Utilizator mihai.alphamihai craciun mihai.alpha Data 5 februarie 2017 16:46:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>
#include <stdlib.h>

#define getmin(a, b) (a < b) ? a : b

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

#define NMAX 100000
#define LOG 17

int rmq[LOG + 2][NMAX + 2];
char lg[NMAX + 2];

int main()  {
    int N, M, v;
    fscanf(fin, "%d%d", &N, &M);
    for(int i = 1;i <= N;i++)
        fscanf(fin, "%d", &v), rmq[0][i] = v;
    for(int i = 2;i <= N;i++)
        lg[i] = lg[i >> 1] + 1;
    for(int j = 1;(1 << j) <= N;j++)
        for(int i = 1;i + (1 << j) <= N + 1;i++)  {
            rmq[j][i] = getmin(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);
        }
    for(int i = 0;i < M;i++)  {
        int a, b;
        fscanf(fin, "%d%d", &a, &b);
        int k = b - a + 1;
        k = lg[k];
        fprintf(fout, "%d\n", getmin(rmq[k][a], rmq[k][b - (1 << k) + 1]));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}