Cod sursa(job #1185206)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 15 mai 2014 10:10:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
using namespace std;
#include <fstream>
#include <cmath>

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

const int Nmax=100000;
const int logN=20;

int v[Nmax];
int rmq[Nmax][logN];

void preprocess(int) ;
int query(int, int) ;

int main()
{
    int i, j, n, q, a, b;
    fin>>n;fin>>q;
    for(i=0; i<n; ++i) fin>>v[i];
    preprocess(n);
/*
    for(i=0; i<n; ++i)
    {
        for(j=0; i+(1<<j)<=n; ++j)
            fout<<rmq[i][j]<<' ';
        fout<<'\n';
    }
*/

    for(i=0; i<q; ++i)
    {
        fin>>a>>b;
        fout<<v[query(a-1, b-1)]<<'\n';
    }
    return 0;
}


void preprocess(int n)
{
    int i, j;
    for(i=0; i<n; ++i) rmq[i][0]=i;
    for(i=1; (1<<i)<n; ++i)
    {
        for(j=0; (1<<i)+j<=n; ++j)
        {
            if(v[rmq[j][i-1]]<v[rmq[j+(1<<(i-1))][i-1]])
                rmq[j][i]=rmq[j][i-1];
            else rmq[j][i]=rmq[j+(1<<(i-1))][i-1];
        }
    }
}


int query(int st, int dr)
{
    int log=log2(dr-st+1);
    if(v[rmq[st][log]]<v[rmq[dr+1-(1<<log)][log]])
        return rmq[st][log];
    return rmq[dr+1-(1<<log)][log];
}