Cod sursa(job #1445833)

Utilizator AndreiBadeciAndrei Badeci AndreiBadeci Data 31 mai 2015 09:55:04
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#define MAX 100003
using namespace std;

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

int n,m,v[MAX],logg[MAX],mat[17][MAX];

void citire()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    for(int i=2;i<=n;i++)
        logg[i]=1+logg[i/2];
    for(int i=1;i<=n;i++)
        mat[0][i]=i;
    for(int i=1;i<=logg[n];i++)
        for(int j=1;j<=n+1-(1<<i);j++)
            if(v[mat[i-1][j]]<v[mat[i-1][j+(1<<(i-1))]])
                mat[i][j]=mat[i-1][j];
            else
                mat[i][j]=mat[i-1][j+(1<<(i-1))];
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fin>>x>>y;
        int lin=logg[y-x+1];
        if(v[mat[lin][x]]<v[mat[lin][y+1-(1<<lin)]])
            fout<<v[mat[lin][x]]<<'\n';
        else
            fout<<v[mat[lin][y+1-(1<<lin)]]<<'\n';
    }
}

int main()
{
    citire();
    return 0;
}