Cod sursa(job #1609696)

Utilizator popescu.octavianPopescu Octavian popescu.octavian Data 22 februarie 2016 22:42:59
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#define NMax 100005
#define LgMax 18
#define Min(a,b) (a<b) ? a : b
using namespace std;
int N, M, v[NMax], i, j, log2[NMax], sol, lg, x, y, RMQ[LgMax][NMax];
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);

    scanf("%d %d",&N,&M);
    for(i=1;i<=N;i++)
    {
        scanf("%d ",&v[i]);
        if(i>1)
            log2[i]=log2[i/2]+1;
        RMQ[i][0]=i;
    }
    for(j=1; (1<<j)<=N; j++)
        for(i=1; i+(1<<j)-1<=N; i++)
            if(v[RMQ[i][j-1]]<=v[RMQ[i+(1<<(j-1))][j-1]])
                RMQ[i][j]=RMQ[i][j-1];
                else RMQ[i][j]=RMQ[i+(1<<(j-1))][j-1];
    for(i=1;i<=M;i++)
    {
        scanf("%d %d",&x,&y);
        lg=log2[y-x+1];
        sol=Min(v[RMQ[x][lg]],v[RMQ[y-(1<<lg)+1][lg]]);
        printf("%d\n",sol);
    }
    return 0;
}