Cod sursa(job #1564247)

Utilizator andreiudilaUdila Andrei andreiudila Data 9 ianuarie 2016 14:58:44
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>
#include <math.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int rmq[18][100001];
int a[100001],logg[100001];
int n,m,x,y,i,l,p,j;


int query(int x,int y)
{
    int p=logg[y-x+1];
    int l=(1<<p);
    int rez=min(rmq[p][x], rmq[p][y-l+1]);
    return rez;
}

int main()
{
    fin>>n>>m;
    for(i=1; i<=n; i++) fin>>a[i];

//contruire

    logg[1]=0;

    for(i=2;i<=n;i++)
       logg[i]=logg[i/2]+1;

// initializare

    for(i=1; i<=n; i++)
        rmq[0][i]=a[i];

    for(i=1,l=2; l<=n; i++,l*=2)
        for(j=1; j+l-1<=n; ++j)
            rmq[i][j]=min(rmq[i-1][j], rmq[i-1][j+l/2]);





    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        fout<<query(x,y)<<'\n';
    }
    return 0;
}