Cod sursa(job #1691325)

Utilizator cristinamateiCristina Matei cristinamatei Data 17 aprilie 2016 22:00:52
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N = 100006;
int n, m, arb[N], maxim;

int max ( int x, int y )
{
    if ( x > y )
        return x;
    return y;
}

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

void query( int nod, int st, int dr, int a, int b )
{
    if ( a <= st && dr <= b )
    {
        maxim = max(maxim, arb[nod]);
        return;
    }
    int mij = (st+dr)/2;
    if ( a <= mij )
        query(2*nod, st, mij, a, b);
    if ( b >= mij+1 )
        query(2*nod+1, mij+1, dr, a, b);
}

int main()
{
    int i, x, a, b;
    in >> n >> m;
    for ( i = 1; i <= n; i++ )
    {
        in >> x;
        update(1, 1, n, i, x);
    }
    for ( i = 1; i <= m; i++ )
    {
        in >> x >> a >> b;
        if ( x == 1 )
            update(1, 1, n, a, b);
        if ( x == 0 )
        {
            maxim = 0;
            query( 1, 1, n, a, b);
            out << maxim<<'\n';
        }
    }
    return 0;
}