Cod sursa(job #1478108)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 27 august 2015 20:42:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>

#define N 100005
#define in "arbint.in"
#define out "arbint.out"

using namespace std;

int arb[N*4 +50],val,poz;
int start,finish,maxim;

int left_son(int nod)
{
    return nod*2;
}

int right_son(int nod)
{
    return nod*2+1;
}

void Update(int nod,int left,int right)
{
    if(left == right)
    {
        arb[nod] = val;
        return;
    }

    int mij = (left + right)/2;
    if(poz <= mij) Update(left_son(nod),left,mij);
    else Update(right_son(nod),mij+1,right);

    arb[nod] = max(arb[left_son(nod)],arb[right_son(nod)]);
}

void Query(int nod,int left,int right)
{
    if(left>=start && right<=finish)
    {
        if(arb[nod]>maxim) maxim=arb[nod];
        return;
    }

    int mij = (left+right)/2;
    if(start<=mij) Query(left_son(nod),left,mij);
    if(finish > mij) Query(right_son(nod),mij+1,right);
}

int main()
{
    int p1,n,m,i;
    ifstream f(in);
    ofstream g(out);

    f>>n>>m;

    for(i=1;i<=n;i++)
    {
        f>>val;
        poz=i;

        Update(1,1,n);
    }

    for(i=1;i<=m;i++)
    {
        f>>p1>>start>>finish;

        if(p1==0)
        {
            maxim=0;
            Query(1,1,n);

            g<<maxim<<"\n";
        }
        else
        {
            poz=start;
            val=finish;

            Update(1,1,n);
        }
    }

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