Cod sursa(job #3355755)

Utilizator andrei_obrejaAndrei Obreja andrei_obreja Data 25 mai 2026 19:47:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
vector<int> a, tree;
void build(int node ,int l, int r)
{
    if(l == r)
    {
        tree[node] = a[l];
        return ;
    }
    int mid = (l + r) / 2;
    build(node * 2, l, mid);
    build(node * 2 + 1, mid + 1, r);
    tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
long long query(int node, int l, int r, int x, int y)
{
    if(x <= l&& r <= y)
        return tree[node];
    if(y < l || x > r)
        return 0;
    return max(query(2 * node, l, (l + r ) / 2, x , y)
                            ,
        query(2 * node + 1, (l + r) / 2 + 1, r, x , y));
}
void update(int node, int l, int r, int val,  int pos)
{
    if (l == r) {
        tree[node] = val;
        return;
    }
    int mid = (l + r) / 2;
    if(pos <= mid)
        update(2 * node, l, mid, val ,pos);
    else
        update(2 * node + 1, mid + 1, r, val ,pos);
    tree[node] = max(tree[node * 2],tree[node * 2 + 1]);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    fin >> n;
    fin >> m;
    a.resize(n + 1);
    tree.resize(4 * (n + 1) + 6);
    for(int i =1; i <=n ; i++)
        fin >> a[i];
    build(1,1,n);
    for(int i = 1; i <= m; i++)
    {
        int type;
        fin >> type;
        if(type)
        {
            int node, val;
            fin >> node >> val;
            update(1, 1, n, val, node);
        }
        else
        {
            int x, y;
            fin >> x >> y;
            fout << query(1, 1, n, x, y) << '\n';
        }
    }

    return 0;
}