Cod sursa(job #923078)

Utilizator Bogdan13Bogdan Stoian Bogdan13 Data 22 martie 2013 20:47:31
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<fstream>
#define NMAX 100004
using namespace std;

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

int N,Q,V[NMAX],M[NMAX][20],log2[NMAX],x,y,k;

void pre()
{
    for (int i=1;i<=N;i++)
    M[i][0]=i;

    for (int j=1;(1<<j)<=N;j++)
        for (int i=1;i<=N-(1<<j)+1;i++)
            if (V[ M[i][j-1] ] < V[ M[i+(1<<j-1)][j-1] ] )
                M[i][j]= M[i][j-1];
            else
                M[i][j]= M[i+(1<<j-1)][j-1];


}


int main()
{
    f>>N>>Q;

    for (int i=1;i<=N;i++)
    f>>V[i];

    pre();

    for (int i=2;i<=N;i++)
    log2[i]=log2[i/2]+1;

    for (int i=1;i<=Q;i++)
    {
        f>>x>>y;
        k=log2[y-x+1];
        g<<min(V[ M[x][k] ], V[ M[y-(1<<k)+1][k] ])<<'\n';
    }


return 0;
}