Cod sursa(job #1380230)

Utilizator Mr.DoomRaul Ignatus Mr.Doom Data 6 martie 2015 23:59:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
using namespace std;

ifstream is("arbint.in");
ofstream os("arbint.out");

int pos, val, n, m, x, l, r, maxn;
int Arb[4 * 100001 + 10];

void Update(int node, int left, int right);
void Query(int node, int left, int right);

int main()
{
    is >> n >> m;
    for ( int i = 1; i <= n; ++i )
    {
        is >> val;
        pos = i;
        Update(1, 1, n);
    }
    for ( int i = 1; i <= m; ++i )
    {
        is >> x;
        switch(x)
        {
            case 0:
                is >> l >> r;
                maxn = -1;
                Query(1, 1, n);
                os << maxn << '\n';
                break;
            case 1:
                is >> pos >> val;
                Update(1, 1, n);
                break;
        }
    }
    is.close();
    os.close();
    return 0;
}



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

    int m = left + ( right - left ) / 2;
    if ( pos <= m )
        Update(2 * node, left, m);
    else
        Update(2 * node + 1, m + 1, right);

    Arb[node] = max(Arb[2 * node], Arb[2 * node + 1]);
}

void Query(int node, int left, int right)
{
    if ( l <= left && right <= r )
    {
        maxn = max(maxn, Arb[node]);
        return;
    }

    int m = left + ( right - left ) / 2;

    if ( l <= m )
        Query(2 * node, left, m);
    if ( r > m )
        Query(2 * node + 1, m + 1, right);
}