Cod sursa(job #848249)

Utilizator costi_.-.Costinnel costi_.-. Data 5 ianuarie 2013 02:45:59
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#define K 17
#define fst(x) (x<<1)
#define nmax 100000
#define minim(a,b) ((a)<(b)?(a):(b))
using namespace std;

int A[4*nmax];
int N,M;

void actualizare(int nod,int st,int dr,int &valoare,int &pozitie)
{
    int m;
    if(st == dr)
    A[nod]=valoare;
    else
    {
        m=(st+dr)/2;
        if(pozitie<=m)
        actualizare(fst(nod),st,m,valoare,pozitie);
        else
        actualizare(fst(nod)+1,m+1,dr,valoare,pozitie);

        A[nod]=minim(A[fst(nod)],A[fst(nod)+1]);
    }
}

void interogare(int nod,int st,int dr,int &start,int &fin,int &rez)
{
    if(start<=st && dr<=fin)
    {
        if(A[nod]<rez)
        rez=A[nod];
        return;
    }
    else
    {
        int m;
        m=(st+dr)/2;
        if(start<m)
        interogare(fst(nod),st,m,start,fin,rez);
        if(m<fin)
        interogare(fst(nod)+1,m+1,dr,start,fin,rez);
    }
}

void citeste_rezolva_scrie()
{
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    int i,rezultat,val,x,y;

    f>>N>>M;
    for(i=1;i<=N;i++)
    {
        f>>val;
        actualizare(1,1,N,val,i);
    }

    for(i=1;i<=M;i++)
    {
        f>>x>>y;
        rezultat=nmax;
        interogare(1,1,N,x,y,rezultat);
        g<<rezultat<<'\n';
    }

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

int main()
{
    citeste_rezolva_scrie();
    return 0;
}