Cod sursa(job #1234045)

Utilizator afkidStancioiu Nicu Razvan afkid Data 26 septembrie 2014 17:25:39
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>

using namespace std;

const char InFile[]="rmq.in";
const char OutFile[]="rmq.out";
const int DIMN=100010;
const int DIMS=1000;

inline int MIN(int a, int b)
{
    return ((a>b)?b:a);
}

int N,M,lgn,v[DIMN],t[DIMN][DIMS],lg[DIMN];

int main()
{
    int a,b,Min,l,k;
    freopen(InFile,"r",stdin);
    freopen(OutFile,"w",stdout);
    scanf("%d %d",&N,&M);
    for(int i=0;i<N;++i)
        scanf("%d",&v[i]);
    for(int i=0;i<N;++i)
        t[i][0]=i;

    lg[0]=0;
    for(int i=1;i<N;++i)
    {
        lg[i]=lg[i/2]+1;
    }

    for(int j=1;(1<<j)<=N;++j)
    {
        for(int i=0; i+(1<<j)-1<N;++i)
        {
            if(v[t[i][j-1]]<v[t[i+(1<<(j-1))][j-1]])
                t[i][j]=t[i][j-1];
            else t[i][j]=t[i+(1<<(j-1))][j-1];

        }
    }
    for(int i=1;i<=M;++i)
    {
        Min=0;
        scanf("%d %d",&a,&b);
        l=lg[b-a-1];
        k=b-(1<<l);
        printf("%d\n",MIN(v[t[a-1][l]],v[t[k][l]]));
    }

    return 0;
}