Cod sursa(job #1027986)

Utilizator laszloasandorLaszlo Sandor laszloasandor Data 13 noiembrie 2013 13:04:35
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <stdio.h>
using namespace std;

#define fr(i,a,b) for(int i=a;i<=b;++i)
#define N 1000010
#define ll long int
#define MIN(a,b) a<b?a:b

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

int main()
{
    freopen("rmq.in","r",stdin);
    //freopen("rmq.out","w",stdout);
    ll l;
    scanf("%ld %ld",&n,&m);
    fr(i,1,n) scanf("%ld\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,lg[n])
        fr(j,1,n)
        {
            l=1<<(i-1);
            if(j+l<=n)
                rmq[i][j]=MIN(rmq[i-1][j],rmq[i-1][j+l]);
            else rmq[i][j]=rmq[i-1][j];
        }

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

}