Cod sursa(job #1362305)

Utilizator codi22FMI Condrea Florin codi22 Data 26 februarie 2015 11:37:58
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <cstdio>
using namespace std;
int i,j,M[100001][10],n,m,V[100000];
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d %d",&n,&m);
    for (i=0;i<n;i++) {scanf("%d",&V[i]);M[i][0]=V[i];}
    int k=1;
    for (j = 1; 1 << j <= n; j++)
          for (i = 0; i + (1 << j) - 1 < n; i++)
              if (M[i][j - 1] < M[i + (1 << (j - 1))][j - 1])
                  M[i][j] = M[i][j - 1];
              else
                  M[i][j] = M[i + (1 << (j - 1))][j - 1];
    for (i=0;i<m;i++)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        a--; b--;

        int x=0;
        int aux;
        if (a>b) {aux=b;b=a;a=aux;}
        if (a!=b)
      {
          while(1<<(x+1)<=b-a) x++;
        cout<<min(M[a][x],M[b-(1<<x)+1][x])<<'\n';
      }
        else cout<<M[a][0]<<'\n';
    }

}