Cod sursa(job #848074)

Utilizator costi_.-.Costinnel costi_.-. Data 4 ianuarie 2013 19:55:04
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 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[1<<K];
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]);
    }
}

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

        if(x1<x2)
        return x1;
        return x2;
    }
}

void citeste_rezolva_scrie()
{
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    int i, 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;
        g<<interogare(1,1,N,x,y)<<'\n';
    }

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

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