Cod sursa(job #668786)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 25 ianuarie 2012 17:33:14
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <fstream>
#define NMAX 100002
#define nivelmax 19
using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

inline int _min(int a,int b){if(a<b) return a;return b;}

int N,M,diferenta,nivel,V[NMAX];
int Lg[NMAX];
int RMQ[nivelmax][NMAX];

int main()
{
    int x,y,i,j;
    in>>N>>M;
    for(i=1;i<=N;i++)in>>V[i];

    //RMQ
    Lg[1] = 0;
    for(i=2;i<=N;i++)Lg[i]=Lg[i/2]+1;

    for(i=1;i<=N;i++)
        RMQ[0][i]=V[i];
    for(i=1;(1<<i)<=N;i++)
    {
        for(j=1;j<=N-(1<<i);j++)
        {
            RMQ[i][j] = _min(RMQ[i-1][j],RMQ[i-1][j+(1<<i)]);
        }
    }

    while(M--)
    {
        in>>x>>y;
        nivel = Lg[x-y+1];
        diferenta = y-x+1-(1<<Lg[x-y+1]);
        out<<_min(RMQ[nivel][x],RMQ[nivel][diferenta+x])<<'\n';
    }
    return 0;
}