Cod sursa(job #1786200)

Utilizator martonsSoos Marton martons Data 22 octombrie 2016 16:10:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>

#define NMAX 100000
#define LOGNMAX 17
using namespace std;

int n, m;
int v[NMAX], lg[NMAX];
int w[LOGNMAX][NMAX];

int min(int a, int b){
    return a<b?a:b;
}

int main()
{
    FILE* f = fopen("rmq.in", "r");
    FILE* f1 = fopen("rmq.out", "w");

    fscanf(f, "%d %d", &n, &m);

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

    for(int i=0;i<n;i++){
        fscanf(f, "%d", &v[i]);
    }

    for(int i=0;i<n;i++){
        w[0][i] = v[i];
    }

    for(int i=1;(1<<i)<=n;i++){
        for(int j=0;j<=(n-(1<<i));j++){
            w[i][j] = min(w[i-1][j], w[i-1][j+(1<<(i-1))]);
        }
    }

    for(int i=0;i<m;i++){
        int x, y;
        fscanf(f, "%d %d", &x, &y);

        int diff = y-x+1;
        int logd = lg[diff];
        int delta = diff - (1<<logd);

        int res = min(w[logd][x-1], w[logd][x-1+delta]);

        fprintf(f1, "%d\n", res);
    }
    return 0;
}