Cod sursa(job #2179673)

Utilizator klbraduRadu Capalb klbradu Data 20 martie 2018 13:13:10
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#define MAXN 100005
#define LOGMAXN 18

int A[MAXN];
int Q[MAXN][LOGMAXN];

void preprocess(int Q[MAXN][LOGMAXN], int A[MAXN], int N) {
    int i, j;
    
    for (i = 1; i <= N; i++) {
        Q[i][0] = i;
    }

    for (j = 1; 1 << j <= N; j++) {
        for (i = 1; i + (1 << j) - 1 <= N; i++) {
            if (A[Q[i][j - 1]] < A[Q[i + (1 << (j - 1))][j - 1]]) {
                Q[i][j] = Q[i][j - 1];
            } else {
                Q[i][j] = Q[i + (1 << (j - 1))][j - 1];
            }
        }
    }
}

int main() {
    int i, N, M, x, y, k;
    FILE *in = fopen("rmq.in", "r");
    FILE *out = fopen("rmq.out", "w");
    fscanf(in, "%d %d", &N, &M);
    for (i = 1; i <= N; i++) {
        fscanf(in, "%d", &A[i]);

    }
    
    preprocess(Q, A, N);
    
    for (i = 0; i < M; i++) {
        fscanf(in, "%d %d", &x, &y);
        for (k = 0; 1 << k <= y - x + 1; k++);
        k--;
        if (A[Q[x][k]] < A[Q[y - (1 << k) + 1][k]]) {
            fprintf(out, "%d\n", A[Q[x][k]]);
        } else {
            fprintf(out, "%d\n", A[Q[y - (1 << k) + 1][k]]);
        }
    }

    fclose(in);
    fclose(out);

    return 0;
}