Cod sursa(job #2155126)

Utilizator andrei.gramescuAndrei Gramescu andrei.gramescu Data 7 martie 2018 17:05:52
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define NMAX 100005
#define LOGMAX 30

int n, m, a[NMAX], log[NMAX], sparce[NMAX][LOGMAX];

int main(){

    int x, y, i, j, index, l, k;
    FILE *fin, *fout;
    fin = fopen("rmq.in", "r");
    fout = fopen("rmq.out", "w");

    fscanf(fin, "%d %d", &n, &m);
    fscanf(fin, "%d ", &a[0]);
    for(i=1; i<n; i++){
        //log[i] = log[i/2] + 1;
        fscanf(fin, "%d ", &a[i]);
    }
    for(i=2; i<=n; i++)
        log[i] = log[i/2] + 1;

    //build sparce
    for(i=0; i<n; i++)
        sparce[i][0] = i;
    for(j=1; (1 << j) <= n; j++){
        for(i=0; i<n; i++){
            if(a[ sparce[i][j-1] ] < a[ sparce[i + (1 << (j-1))][j-1] ])
                sparce[i][j] = sparce[i][j-1];
            else sparce[i][j] = sparce[i + (1 << (j-1))][j-1];
        }
    }

    //query
    for(i=1; i<=m; i++){
        fscanf(fin, "%d %d", &x, &y);
        x--;
        y--;
        l = y - x + 1;
        k = log[l];
        fprintf(fout, "%d\n", min(a[ sparce[x][k] ], a[ sparce[x + l - (1 << k)][k] ]));
    }

    return 0;
}