Cod sursa(job #3213043)

Utilizator robert2007oprea robert robert2007 Data 12 martie 2024 13:39:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int v[100005], arb[4 * 100005], a, b, c, n, m;
void build(int nod, int s, int d)
{
    int mijl;
    if(s == d)
        arb[nod] = v[s];
    else
    {
        mijl = (s + d) / 2;
        build(nod * 2, s, mijl);
        build(nod * 2 + 1, mijl+ 1, d);
        arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
    }
}
void update(int nod, int s, int d, int p, int nr)
{
    int mijl;
    if(s == d)
        arb[nod] = nr;
    else
    {
        mijl = (s + d) / 2;
        if(p <= mijl)
            update(nod * 2, s, mijl, p, nr);
        else
            update(nod * 2 + 1, mijl + 1, d, p, nr);
        arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
    }
}
int query(int nod, int s, int d, int a, int b)
{
    int mijl;
    if(a <= s and d <= b)
        return arb[nod];
    else
    {
        mijl = (s + d) / 2;
        if(b <= mijl)
            return query(nod * 2, s, mijl, a, b);
        if (mijl + 1 <= a)
            return query(nod * 2 + 1, mijl + 1, d, a, b);
        return max(query(nod * 2, s, mijl, a, b), query(nod * 2 + 1, mijl + 1, d, a, b));
    }
}

int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        f >> v[i];
    }
    build(1, 1, n);
    for(int i = 1; i <= m; i++)
    {
        f >> a >> b >> c;
        if(a == 0)
            g << query(1, 1, n, b, c) << endl;
        else
            update(1, 1, n, b, c);
    }
    return 0;
}