Cod sursa(job #2001290)

Utilizator victoreVictor Popa victore Data 16 iulie 2017 12:15:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include<cstdio>


using namespace std;

const int nmax=1e5+5;

int v[nmax],logb2[nmax];
int rmq[nmax][17];

inline int min(int a,int b)
{
    if(a>b)
        return b;
    return a;
}

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n,i,j,m;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%d",&v[i]),rmq[i][0]=v[i];
    logb2[1]=0;
    for(i=2;i<=n;++i)
        logb2[i]=logb2[i/2]+1;
    for(j=1;(1<<j) <= n; ++j)
        for(i=1; i + (1<<j) - 1 <= n ; ++i)
            rmq[i][j]=min(rmq[i][j-1],rmq[i + (1<<(j-1))][j-1]);
    int x,y,lg,add;
    while(m--)
    {
        scanf("%d%d",&x,&y);
        lg=logb2[y-x+1];
        add=y-x+1-(1<<lg);
        printf("%d\n",min(rmq[x][lg],rmq[x+add][lg]));
    }
}