Cod sursa(job #991875)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 31 august 2013 17:30:10
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>

using namespace std;

int n;
int v[100005];
int din[17][100005];

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

int logaritm(int x)
{
    int p=0;
    while(x>1)
    {
        x/=2;
        p++;
    }
    return p;
}

void precalc()
{
    int i,j,ln=logaritm(n);
    for(i=1;i<=n;i++)
        din[0][i]=v[i];
    for(i=1;i<=ln;i++)
        for(j=1;j<=n;j++)
            if((j+(1<<i)-1)<=n)
                din[i][j]=minim(din[i-1][j],din[i-1][j+(1<<(i-1))]);
}

int main()
{
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");

    int i,m=0;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        cin>>v[i];
    precalc();
    //int j,ln=logaritm(n);
    //for(i=0;i<=ln;i++)
    //{
        //for(j=1;j<=n;j++)
        //    cout<<din[i][j]<<' ';
        //cout<<endl;
    //}
    int a,b,l;
    cin>>m;
    for(i=0;i<m;i++)
    {
        cin>>a>>b;
        l=logaritm(b-a+1);
        cout<<minim(din[l][a],din[l][b-(1<<l)+1])<<'\n';
    }
    cin.close();
    cout.close();
    return 0;
}