Cod sursa(job #1032881)

Utilizator vasandANDREI POP vasand Data 16 noiembrie 2013 10:21:09
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
# include <iostream>
# include <fstream>
# define nmax 100000
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n,m,v[nmax],arb[nmax], val, pos, ps, pd,maxim;

int care(int a, int b)
{
    if(a>b)
        return a;
    else
        return b;
}

void creare(int nod, int st, int dr)
{
    int mij;
    if((st==dr))
    {
        arb[nod]=v[st];
        return;
    }
    else
    {
        mij=(st+dr)/2;
            creare(nod*2, st, mij);
            creare(nod*2+1, mij+1, dr);

        arb[nod]=care(arb[nod*2], arb[nod*2+1]);
    }
}

void update(int nod, int st, int dr)
{
    int mij=(st+dr)/2;
    if(st==dr && st==pos)
    {
        arb[nod]=val;
        return;
    }
    else
    {
        if(pos<=mij)
            update(nod*2, st, mij);
        else
            update(nod*2+1, mij+1, dr);

        arb[nod]=care(arb[nod*2], arb[nod*2+1]);
    }
}

void val_max(int nod, int st, int dr)
{
    int mij=(st+dr)/2;
    if(st>=ps && dr<=pd)
    {
        if(maxim < arb[nod])
            maxim=arb[nod];
        return;
    }
    else
    {
        if(ps<=mij)
            val_max(nod*2, st, mij);
        if(mij<pd)
            val_max(nod*2+1, mij+1, dr);
    }
}

int main()
{
    f>>n>>m;
    int i;
    for(i=1; i<=n; i++)
        f>>v[i];
    creare(1, 1, n);

    int caz;
    for(i=1; i<=m; i++)
    {
        f>>caz;
        if(caz==0)
        {
            f>>ps>>pd;
            maxim=-1;
            val_max(1, 1, n);
            g<<maxim<<'\n';
        }
        else
        {
            f>>pos>>val;
            v[pos]=val;
            update(1, 1, n);
        }
    }

    return 0;
}