Cod sursa(job #3220081)

Utilizator Radu_VasileRadu Vasile Radu_Vasile Data 2 aprilie 2024 11:49:21
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
#define MAXN 100000
#define LOG 17
#define MAXNR 1000000
int rmq[LOG][MAXN];
char e[MAXNR + 1];
static inline min(int a, int b){
    return a < b ? a : b;
}
int main()
{
    FILE *fin, *fout;
    int n, m, i, j, p, l, r;
    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", &rmq[0][i]);
    }
    for( p = 1; (1 << p) <= n; p++ ){
        for(i = 1; i <= n; i++ ){
            rmq[p][i] = rmq[p - 1][i];
            j = (1 << (p - 1)) + i;
            if(j <= n && rmq[p - 1][j] < rmq[p][i])
                rmq[p][i] = rmq[p - 1][j];
        }
    }
    for( i = 2; i <= MAXNR; i++ ){
        e[i] = e[i / 2] + 1;
    }
    for(i = 0; i < m; i++){
        fscanf(fin, "%d%d", &l, &r);
        p = e[r - l + 1];
        fprintf(fout, "%d\n", min(rmq[p][l], rmq[p][r - (1 << p) + 1]));
    }

    fclose(fin);
    fclose(fout);

    return 0;
}