Cod sursa(job #742992)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 2 mai 2012 18:25:50
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#define inf 1<<30
#define LE 100007
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int minim,i,A[2*LE],b[LE],X,Y,j,n,m;
void Push(int K,int PO)
{
  int st=1;
  int dr=n;
  int poz=1,mij;

  while (6)
    {
      mij=(st+dr)/2;
      A[poz]=min(A[poz],K);

      if (st==dr)
        break;

      if(PO<=mij)
        {
          dr=mij;
          poz*=2;
        }
      else
        {
          st=mij+1;
          poz=poz*2+1;
        }
    }
}

void query(int st,int dr,int Poz)
{
  if (X<=st&&Y>=dr)
    {
      minim=min(A[Poz],minim);
      return;
    }
  int mij=(st+dr)/2;

  if (X<=mij)
    query(st,mij,2*Poz);

  if (Y>mij)
  query(mij+1,dr,2*Poz+1);
}
int main()
{
  f>>n>>m;
  for(i=1; i<=n+n+n; ++i)
    A[i]=inf;

  for(i=1; i<=n; ++i)
    {
      f>>b[i];
      Push(b[i],i);
    }

  for(j=1; j<=m; ++j)
    {
      f>>X>>Y;
      minim=inf;
      query(1,n,1);
      g<<minim<<'\n';

    }



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