Cod sursa(job #3282761)

Utilizator XxThornadoxXStoica Teodora XxThornadoxX Data 6 martie 2025 18:33:56
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int *tree = new int[400005], *v = new int[100001];

void build(int nod, int l, int r)
{
    if(l == r)
        tree[nod] = v[l];
    else
    {
        build(2*nod, l, (l+r)/2);
        build(2*nod+1, (l+r)/2+1, r);
        tree[nod] = max(tree[2*nod], tree[2*nod+1]);
    }
}

void update(int nod, int l, int r, int a, int b)
{
    if(l == r && l == a)
        tree[nod] = b;
    else
    {
        int m = (l+r)/2;
        if(a <= m)
            update(2*nod,l,m,a,b);
        else
            update(2*nod+1, m+1, r, a, b);
        tree[nod] = max(tree[2*nod], tree[2*nod+1]);
    }
}

int query(int nod, int l, int r, int x, int y)
{
    if(x > y)
        return 0;
    if(l == x && r == y)
        return tree[nod];
    int m = (l+r)/2;
    return max(query(2*nod, l, m, x, min(y, m)), query(2*nod+1, m+1, r, max(x,m+1), y));
}

int main()
{
    int n, q, t, a, b;
    fin >> n >> q;

    for(int i = 1; i <= n; ++i)
        fin >> v[i];

    build(1, 1, n);

    while(q--)
    {
        fin >> t >> a >> b;
        if(t == 0)
            fout << query(1, 1, n, a, b) << '\n';
        else
            update(1, 1, n, a, b);
    }
    return 0;
}