Cod sursa(job #696866)

Utilizator GaborGabrielFMI - GabrielG GaborGabriel Data 28 februarie 2012 20:38:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <stdio.h>
#include <vector>
#include <fstream>
#define minim(a,b) ((a>b)?b:a)
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int n,m,v[100005],rmq[100005][20],mk[100005];
int i,k,lg,dif,z1,z2,exp,lim;

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++) f>>v[i];
    for(i=1;i<=n;i++) rmq[i][0]=v[i];
    for(k=1;(1<<k)<=n;k++)
    {
        lim=n-(1<<k)+1;
        for(i=1;i<=lim;i++)
        {
            lg=(1<<(k-1));
            rmq[i][k]=minim(rmq[i][k-1],rmq[i+lg][k-1]);
        }
    }
    mk[1]=0;

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

    for(i=1;i<=m;i++)
    {
        f>>z1>>z2;
        lg=z2-z1+1;
        exp = mk[lg];
        dif=lg-(1<<exp);
        g<<minim(rmq[z1][exp],rmq[z1+dif][exp])<<'\n';
    }
    f.close();
    g.close();
    return 0;
}