Cod sursa(job #1596855)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 11 februarie 2016 14:33:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#define INF 0x3f3f3f3f
using namespace std;

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

using VI = vector<int>;
using VVI = vector<VI>;

int n, m;
int poz, val, lt, rt;
VI a;

void Read();
void Update(int st, int dr, int nod);
int Max(int st, int dr, int nod);

int main()
{
    Read();
    int tip;
    while ( m-- )
    {
        is >> tip >> lt >> rt;
        if ( !tip )
            os << Max(1, n, 1) << "\n";
        else
        {
            poz = lt;
            val = rt;
            Update(1, n, 1);
        }
    }
    is.close();
    os.close();
    return 0;
}

int Max(int st, int dr, int nod)
{
    if ( lt <= st && dr <= rt )
        return a[nod];
    int md = ( st + dr ) / 2, rez = 0;
    if ( lt <= md )
        rez = Max(st, md, 2 * nod);
    if ( md < rt )
        rez = max(rez, Max(md + 1, dr, 2 * nod + 1));
    return rez;
}

void Update(int st, int dr, int nod)
{
    if ( st == dr )
    {
        a[nod] = val;
        return;
    }
    int md = ( st + dr ) / 2;
    if ( poz <= md )
        Update(st, md, 2 * nod);
    else
        Update(md + 1, dr, 2 * nod + 1);
    a[nod] = max(a[2 * nod], a[2 * nod + 1]);
}

void Read()
{
    is >> n >> m;
    a = VI(4 * n + 1);
    for ( poz = 1; poz <= n; ++poz )
    {
        is >> val;
        Update(1, n, 1);
    }
}