Cod sursa(job #1175947)

Utilizator robertstrecheStreche Robert robertstreche Data 25 aprilie 2014 10:40:45
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>
#include <cmath>

#define lmax 100001

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n,q,i,j,k,st,dr;
int v[lmax];
int a[lmax][21];

int main()
{
    f>>n>>q;

    for (i=0;i<n;i++)
     f>>v[i];

    for (i=0;i<n;i++)
      a[i][0]=i;

    for (i=1;i<=20;i++)
     for (j=0;j<=n-(1<<(i-1));j++)
       if (v[a[j][i-1]]<v[a[j+(1<<(i-1))][i-1]])
         a[j][i]=a[j][i-1];
       else
         a[j][i]=a[j+(1<<(i-1))][i-1];

     for (i=1;i<=q;i++)
      {
          f>>st>>dr;

          st--;
          dr--;

          k=log2(dr-st+1);

          if (v[a[st][k]]<v[a[dr-(1<<k)+1][k]])
           g<<v[a[st][k]]<<'\n';
          else
           g<<v[a[dr-(1<<k)+1][k]]<<'\n';

      }


    f.close();
    g.close();
}