Cod sursa(job #1193237)

Utilizator ZenusTudor Costin Razvan Zenus Data 31 mai 2014 12:32:36
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>

using namespace std;

#define min(a,b) ((a<b) ? a : b)
#define NMAX 100005
#define LgMAX 25

int D[LgMAX][NMAX];
int log[NMAX];
int N;

int Query(int X,int Y)
{
    int k=log[Y-X];
    return min(D[k][X],D[k][Y-(1<<k)+1]);
}

void Build_RMQ()
{
   int i,j;

   for (i=1;i<=log[N];++i)
     for (j=1;j<=N-(1<<(i-1));++j)
     D[i][j]=min(D[i-1][j],D[i-1][j+(1<<(i-1))]);
}

void Build_log()
{
    for (int i=2;i<=N;++i)
    log[i]=log[i/2]+1;
}

void Read()
{
    int i,M,X,Y;

    scanf("%d%d",&N,&M);

    for (i=1;i<=N;++i)
    scanf("%d",&D[0][i]);

    Build_log();
    Build_RMQ();

    while (M--)
    {
        scanf("%d%d",&X,&Y);

        printf("%d\n",Query(X,Y));
    }
}

int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);

Read();

return 0;
}