Cod sursa(job #998483)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 17 septembrie 2013 10:01:20
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

int v[100005],n;
int din_min[18][100005];
//int din_max[18][50005];
int log2[100005];

int minim(int x,int y)
{
    if(x<y)
       return x;
    return y;
}

/*
int maxim(int x,int y)
{
    if(x>y)
       return x;
    return y;
}*/

void prep_log()
{
    int i;
    log2[1]=0;
    for(i=2;i<=n;i++)
        log2[i]=log2[i>>1]+1;
}

void prep()
{
    int i,j,lung=log2[n];
    for(i=1;i<=n;i++)
       din_min[0][i]=v[i];//din_max[0][i]=v[i];
    for(i=1;i<=lung;i++)
    {
        for(j=1;j<=n;j++)
        {
            if((j+((1<<i)-1))<=n)
            {
                din_min[i][j]=minim(din_min[i-1][j],din_min[i-1][j+(1<<(i-1))]);
   //             din_max[i][j]=maxim(din_max[i-1][j],din_max[i-1][j+(1<<(i-1))]);
            }
        }
    }
}

int main()
{
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");
    int q,i,a,b,lung,mini,maxi;
    cin>>n>>q;
    prep_log();
    //for(i=1;i<=n;i++)
    //    cout<<log2[i]<<' ';
    for(i=1;i<=n;i++)
       cin>>v[i];
    prep();
    for(i=0;i<q;i++)
    {
        cin>>a>>b;
        lung=b-a+1;
        lung=log2[lung];
        mini=minim(din_min[lung][a],din_min[lung][b-(1<<lung)+1]);
        //maxi=maxim(din_max[lung][a],din_max[lung][b-(1<<lung)+1]);
        //cout<<maxi-mini<<'\n';
        cout<<mini<<'\n';
    }
    cin.close();
    cout.close();
    return 0;
}