Cod sursa(job #541439)

Utilizator zizou_adyIacov Adrian zizou_ady Data 25 februarie 2011 11:19:06
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
using namespace std;
 
ifstream fin("rmq.in");
ofstream fout("rmq.out");
 
#define DIM 100001
 
int m, n;
 
long long arb[4*DIM];
int inc, sf, val, poz;

long long minim;
 
void Read();
void Update(int nod, int st, int dr);
void Query(int nod, int st, int dr);
 
int main()
{
    Read();
    int x, y, v;
    for ( int i = 1; i <= m; ++i )
    {
        fin >> x >> y;
		minim = 100001;
		inc = x;
		sf = y;
		Query (1, 1, n);
		fout << minim << '\n';
    }
}
 
void Read()
{
    int x;
    fin >> n >> m;
    for ( int i = 1; i <= n; ++i )
    {
        fin >> x;
        poz = i, val = x;
        Update(1, 1, n);
    }
}
 
void Update(int nod, int st, int dr)
{
    if (st == dr)
    {
        arb[nod] = val;
        return;
    }
      
    int mij = (st + dr)/2;
    if ( poz <= mij )
		Update( 2*nod, st, mij);
    else             
        Update( 2*nod+1, mij+1, dr);
      
    arb[nod] = min( arb[2*nod], arb[2*nod+1] );
}
  
void Query(int nod, int st, int dr)
{
    if ( inc <= st && dr <= sf )
    {
        if ( minim > arb[nod] )
            minim = arb[nod];
        return;
    }
       
    int mij = (st+dr)/2;    
    if ( inc <= mij )
        Query( 2*nod, st, mij);
    if ( mij < sf )
        Query( 2*nod+1, mij+1, dr);
}