Cod sursa(job #1397554)

Utilizator Toast97Calin Farcas Toast97 Data 23 martie 2015 16:41:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

using namespace std;

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

int arbmax [400005];

int n, m, maxi;

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

void update (int poz, int val, int nod, int stanga, int dreapta)
{
    if (stanga == dreapta)
    {
        arbmax[nod] = val;
        return;
    }

    int mij = (stanga + dreapta) / 2;

    if (poz <= mij)
        update (poz, val, 2 * nod, stanga, mij);
    else
        update (poz, val, 2 * nod + 1, mij + 1, dreapta);

    arbmax[nod] = maxim (arbmax[2 * nod], arbmax[2 * nod + 1]);
}

void cauta (int a, int b, int nod, int stanga, int dreapta)
{
    if (a <= stanga && dreapta <= b)
    {
        maxi = maxim (maxi, arbmax[nod]);
        return;
    }

    int mij = (stanga + dreapta) / 2;

    if (a <= mij)
        cauta (a, b, 2 * nod, stanga, mij);
    if (mij < b)
        cauta (a, b, 2 * nod + 1, mij + 1, dreapta);
}

void creare ()
{
    f >> n >> m;

    int nr;

    for (int i = 1; i <= n; i ++)
    {
        f >> nr;

        update (i , nr, 1, 1, n);
    }
}

int main()
{
    creare ();

    int tip, a, b;

    for (int i = 1; i <= m; i ++)
    {
        f >> tip >> a >> b;

        if (tip)
            update (a, b, 1, 1, n);
        else
        {
            maxi = 0;

            cauta (a, b, 1 , 1, n);

            g << maxi << '\n';
        }
    }

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