Cod sursa(job #848255)

Utilizator costi_.-.Costinnel costi_.-. Data 5 ianuarie 2013 05:45:31
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#define nmax 100001
#define inf 0x3f3f3f3f
using namespace std;

int A[3*nmax];
int N,M,rezultat;

int minim(int &a,int &b)
{
    if(a<b)
    return a;
    return b;
}

void actualizare(int nod,int st,int dr,int poz,int val)
{
    if(st == dr)
    A[nod]=val;
    else
    {
        int mij=(st+dr)/2;

        if(poz<=mij)
        actualizare(2*nod,st,mij,poz,val);
        else
        actualizare(2*nod+1,mij+1,dr,poz,val);

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

void interogare(int nod,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
    {
        if(A[nod]<rezultat)
        rezultat=A[nod];
    }
    else
    {
        int mij=(st+dr)/2;
        if(a<=mij)
        interogare(2*nod,st,mij,a,b);
        if(mij<b)
        interogare(2*nod+1,mij+1,dr,a,b);
    }
}

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

    int i,a,b,val;

    f>>N>>M;

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

    for(i=1;i<=M;i++)
    {
        f>>a>>b;
        rezultat=inf;
        interogare(1,1,N,a,b);
        g<<rezultat<<'\n';
    }

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

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