Cod sursa(job #163420)

Utilizator vlad.maneaVlad Manea vlad.manea Data 22 martie 2008 10:39:53
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>

int N, M;

int A[100005], Ma[100005][20];

void read()
{
  int i;

  freopen("rmq.in", "r", stdin);

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

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

int pozmin(int i, int j)
{
  if (A[i] <= A[j])
    return i;
  return j;
}

void solve()
{
  int i, logN, j;

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

  for (logN = 0; (1<<logN) <= N; ++logN); --logN;

  for (j = 1; j <= logN; ++j)
    for (i = 0; i < N; ++i)
      Ma[i][j] = pozmin(Ma[i][j-1], Ma[i+(1<<(j-1))][j-1]);
}

void write()
{
  int a, b, itv, logN;

  freopen("rmq.out", "w", stdout);

  while (M--)
  {
    scanf("%d%d", &a, &b);

    for (itv = b-a+1, logN = 0; (1<<logN) <= itv; ++logN); logN--;

    a--, b--;

    printf("%d\n", A[pozmin(Ma[a][logN], Ma[b-(1<<logN)+1][logN])]);
  }
}

int main()
{
  read();

  solve();

  write();

  return 0;
}