Cod sursa(job #2126639)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 9 februarie 2018 19:55:21
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <bits/stdc++.h>
#define MAXN 100000
#define MAXLOG 37

int v[1 + MAXN];
int rmq[1 + MAXLOG][1 + MAXN];
int lg[1 + MAXN];
int main(){
    FILE*fi,*fo;
    fi = fopen("rmq.in","r");
    fo = fopen("rmq.out","w");

    int n, m;
    fscanf(fi,"%d%d", &n, &m);
    for(int i = 1; i <= n; i++) fscanf(fi,"%d", &v[i]);

    lg[1] = 0;
    for(int i = 2; i <= n; i++) lg[i] = 1 + lg[i / 2];

    for(int i = 1; i <= n; i++) rmq[0][i] = v[i];
    for(int i = 1; (1 << i) <= n; i++)
        for(int j = 1; j + (1 << i) - 1 <= n; j++)
            rmq[i][j] = std::min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);

    for(int i = 1; i <= m; i++){
        int a, b;
        fscanf(fi,"%d%d", &a, &b);
        fprintf(fo,"%d\n", std::min(rmq[lg[b - a + 1]][a], rmq[lg[b - a + 1]][b - (1 << lg[b - a + 1]) + 1]));
    }

    return 0;
}