Cod sursa(job #1214406)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 30 iulie 2014 11:45:02
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
long nr,x,n,i,j,p,m,st,dr,minn,mn[18][100011],urm[100001];
int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
        f>>mn[0][i];
    nr=1;x=2;
    while(x<=n)
    {
        nr++;
        x*=2;
    }
    x=1;
    for (i=1;i<nr;i++)
    {
        for (j=1;j<=n-x+1;j++)
            mn[i][j]=min(mn[i-1][j], mn[i-1][j+x]);
        x*=2;
    }
    urm[1]=0; urm[2]=1; x=2;
    for (i=3;i<=n;i++)
        if (x*2==i)
        {
            x*=2;
            urm[i]=urm[i-1]+1;
        }
        else urm[i]=urm[i-1];

    for (i=1;i<=m;i++)
    {
        f>>st>>dr;
        x=dr-st+1;
        minn=mn[0][dr];
        while (x!=0)
        {
            p=1<<urm[x];
            minn=min(mn[urm[x]][dr-p+1],minn);
            x-=p;
            dr-=p;
        }
        g<<minn<<'\n';
    }
    f.close();
    g.close();
    return 0;
}