Cod sursa(job #1011658)

Utilizator laszloasandorLaszlo Sandor laszloasandor Data 17 octombrie 2013 09:04:50
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <stdio.h>

#define fr(i,a,b) for(int i=a;i<=b;++i)
#define N 100002
#define ll long int

ll n,m;
ll rmq[20][N];
ll lg[N];
ll t[N];

int MIN(ll a,ll b)
{
    return a<b?a:b;
}

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    ll l;
    scanf("%ld %ld",&n,&m);
    fr(i,1,n) scanf("%d\n",&t[i]);
    lg[1]=0;
    fr(i,2,n) lg[i]=lg[i/2]+1;
    fr(i,1,n) rmq[0][i]=t[i];
    fr(i,1,(1<<i))
        fr(j,1,n-(1<<i)+1)
        {
            l=1<<(i-1);
            rmq[i][j]=MIN(rmq[i-1][j],rmq[i-1][j+1]);
        }

    ll x,y,dif,s;
    fr(i,1,m)
    {
        scanf("%ld %ld",&x,&y);
        dif=y-x+1;
        l=lg[dif];
        s=dif-(1<<l);
        printf("%ld\n",MIN(rmq[l][x],rmq[l][x+s]));
    }

}