Cod sursa(job #1617513)

Utilizator cristian.caldareaCaldarea Cristian Daniel cristian.caldarea Data 27 februarie 2016 14:50:50
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

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

const int Nmax = 100002;

int n, m, val, pos, sol, A, B;
int arb[Nmax * 4 + 6];


void Update(int x, int l, int r);
void Query(int x, int l, int r);


int main()
{
    fin >> n >> m;
    for ( int i = 1; i <= n; i++ )
    {
        fin >> val;
        pos = i;
        Update(1, 1, n);
    }
    int x;
    for ( int i = 1; i <= m; i++ )
    {
        fin >> x;
        if ( x == 1 )
        {
            fin >> pos >> val;
            Update(1, 1, n);
        }
        else
        {
            sol = -1;
            fin >> A >> B;
            Query(1, 1, n);
            fout << sol << '\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}

void Update(int x, int l, int r)
{
    if ( l == r )
    {
        arb[x] = val;
        return;
    }
    int m = (l + r) / 2;
    if ( pos <= m )
        Update( x * 2, l, m);
    else
        Update( x * 2 + 1, m + 1, r);

    arb[x] = max(arb[x * 2], arb[x * 2 + 1]);
}

void Query(int x, int l, int r)
{
    if ( A <= l && r <= B )
    {
        sol = max(sol, arb[x]);
        return;
    }

    int m = (l + r) / 2;

    if ( A <= m )
        Query( 2 * x, l, m);
    if ( m < B )
        Query( 2 * x + 1, m + 1, B);
}