Cod sursa(job #216091)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 22 octombrie 2008 18:14:09
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define MAX 100001
#define infinit 0x3f3f3f

using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

int n,m,h[4*MAX],sir[MAX],poz,val;
int lft,rigt;
int rez;

int min(int a,int b)
{
     return a<b?a:b;
}

void adauga(int nod,int st,int dr)
{
     if (st==dr)
          h[nod]=val;
     else
     {
          int mij=(st+dr)>>1;
          int stg=nod<<1;
          int dre=(nod<<1)+1;
          if (poz<=mij)
               adauga(stg,st,mij);
          if (poz>mij)
               adauga(dre,mij+1,dr);
          h[nod]=min(h[stg],h[dre]);
     }
}

void citire()
{
     fin>>n>>m;

     memset(h,infinit,sizeof h);

     for ( poz=1;poz<=n;poz++)
     {
          fin>>val;
          adauga(1,1,n);
     }
}

void fi(int nod,int st,int dr)
{
     if (st>=lft && dr<=rigt)
          rez=min(rez,h[nod]);
     else
     {
          int mij=(st+dr)>>1;
          int stg=nod<<1;
          int dre=(nod<<1)+1;
     if (lft<=mij)
          fi(stg,st,mij);
     if (rigt>mij)
          fi(dre,mij+1,dr);
     }
}

void afisare()
{
     for (int i=0;i<m;i++)
     {
          fin>>lft>>rigt;
          rez=infinit;
          fi(1,1,n);
          fout<<rez<<"\n";
     }
}

int main ()
{
     citire();
     afisare();
     return 0;
}