Cod sursa(job #1046009)

Utilizator tavi.belu1994FMI Belu Andrei Octavian tavi.belu1994 Data 2 decembrie 2013 16:25:20
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#define NMAX 100001
#define LMAX 18
FILE *f,*g;
using namespace std;

long int RMQ[LMAX][NMAX],N,M,LG[NMAX],A[NMAX];

int main()
{
    f = fopen("rmq.in","r");
    g = fopen("rmq.out","w");
    long int i,j,l;
    fscanf(f,"%ld %ld\n",&N,&M);
    for(i=1 ; i<=N ; i++)
    {
        fscanf(f,"%ld\n",&A[i]);
    }
    LG[1] = 0;
    for(i=2 ; i<=N ; i++)
    {
        LG[i] = LG[i/2] + 1;
    }
    for(i=1 ; i<=N ; i++)
    {
        RMQ[0][i] = A[i];
    }
    for(i=1 ; (1<<i)<=N ; i++)
    {
        for(j=1 ; j<=N-(1<<i)+1 ; j++)
        {
            l = 1<<(i-1);
            RMQ[i][j] = min( RMQ[i-1][j] , RMQ[i-1][j+l]);
        }
    }
    for (i=1 ; i<=M ; i++)
    {
        long int x,y,dif,sh;
        fscanf(f,"%ld %ld\n",&x,&y);
        dif = y - x + 1;
        l = LG[dif];
        sh = dif - (1<<l);
        fprintf(g,"%ld\n",min( RMQ[l][x] , RMQ[l][x+sh] ));
    }
    fclose(f);
    fclose(g);
    return 0;
}