Cod sursa(job #1449455)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 9 iunie 2015 17:06:43
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#include <math.h>
#define Dim 100010

int N,M,T[Dim][18],A[Dim],Lg;

int main()
{
    int X,Y,i,j;

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

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

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

      for (i = 0;i < N;i++)
        T[i][0] = i;

      for (j = 1;1 << j <= N;j++)
          for (i = 0;i + (1 << j) <= N;i++)
              if (A[T[i][j-1]] <= A[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 (i = 1;i <= M;i++)
      {
          scanf("%d %d",&X,&Y);
          X--;
          Y--;
          int L = trunc(log2(Y - X + 1));

           if (A[T[X][L]] <= A[T[Y-(1 << L)+1][L]])
                    printf("%d\n",A[T[X][L]]);
           else
                    printf("%d\n",A[T[Y-(1 << L)+1][L]]);
      }
    return 0;
}