Cod sursa(job #1785755)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 21 octombrie 2016 21:32:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
using namespace std;
ifstream ka("arbint.in");
ofstream ki("arbint.out");

const int N_MAX = 100000;

int sol[3 * N_MAX];
int n, m, a, b;
char c;

int cauta(int a, int b, int inc, int sf, int nod)
{
    if(a == inc && b == sf)
        return sol[nod];
    else if(b <= (inc + sf) / 2)
        return cauta(a, b, inc, (inc + sf) / 2, nod * 2);
    else if(a >= (inc + sf) / 2 + 1)
        return cauta(a, b, (inc + sf) / 2 + 1, sf, nod * 2 + 1);
    else
        return max(cauta(a, (inc + sf) / 2, inc, (inc + sf) / 2, nod * 2), cauta((inc + sf) / 2 + 1, b, (inc + sf) / 2 + 1, sf, nod * 2 + 1));
}

void modifica(int a, int b, int inc, int sf, int nod)
{
    if(inc == sf)
        sol[nod] = b;
    else
    {
        if(a <= (inc + sf) / 2)
            modifica(a, b, inc, (inc + sf) / 2, nod * 2);
        else
            modifica(a, b, (inc + sf) / 2 + 1, sf, nod * 2 + 1);
        sol[nod] = max(sol[nod * 2], sol[nod * 2 + 1]);
    }
}

int main()
{
    ka >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        ka >> b;
        modifica(i, b, 1, n, 1);
    }
    for(int i = 1; i <= m; i++)
    {
        ka >> c >> a >> b;
        if(c == '0')
        {
            if(a > b)
                swap(a, b);
            ki << cauta(a, b, 1, n, 1) << '\n';
        }
        else
            modifica(a, b, 1, n, 1);
    }
}