Cod sursa(job #3310334)

Utilizator robigiirimias robert robigi Data 13 septembrie 2025 00:19:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

vector<int> buildTree(int n, const vector<int>& a)
{
    int N = 1;
    while (N < n)
        N <<= 1;

    vector<int> tree(2 * N);
    tree[0] = N;
    for (int i = 0; i < n; ++i)
    {
        tree[N + i] = a[i];
    }

    for (int i = N + n; i <= 2 * N - 1; ++i)
        tree[i] = -1e9;

    for (int i = N - 1; i > 0; --i)
    {
        tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
    }

    return tree;
}

void updatePoint(vector<int>& tree, int pos, int val)
{
    int i = tree[0] + pos;
    tree[i] = val;

    i /= 2;

    while (i >= 1)
    {
        tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
        i /= 2;
    }
}

int queryMax(const vector<int>& tree, int l, int r)
{
    int N = tree[0];
    l += N;
    r += N;

    int maxl = -1e9;
    int maxr = -1e9;
    while (l <= r)
    {
        if (l & 1) { maxl = max(maxl, tree[l]); ++l; }
        if (!(r & 1)) { maxr = max(maxr, tree[r]); r--; }
        l >>= 1;
        r >>= 1;
    }

    return max(maxl, maxr);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr); // delete for interactive problems

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

    int n, m;
    fin >> n >> m;
    vector<int> a(n);

    for (int i = 0; i < n; i++)
        fin >> a[i];

    vector<int> tree = buildTree(n, a);

    for (int i = 0; i < m; ++i)
    {
        int q, a, b;
        fin >> q >> a >> b;
        if (q == 1)
        {
            updatePoint(tree, a - 1, b);
        }
        else
        {
            fout << queryMax(tree, a - 1, b - 1) << "\n";
        }
    }

    return 0;
}