Cod sursa(job #3332979)

Utilizator ONLYGODYBochis Andrei ONLYGODY Data 10 ianuarie 2026 11:21:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>
using namespace std;

#define ll int
#define cll const ll
#define nl '\n'
#define sp ' '
#define rightChild index + 2 * ((l + r) / 2 - l + 1)
#define leftChild index + 1
// #define fi cin
// #define fo cout

const string FILENAME = "arbint";
ifstream fi (FILENAME + ".in");
ofstream fo (FILENAME + ".out");

vector<ll> aint;
ll n, m;

void read();
void update(ll, ll, ll, ll, ll);
void updateNodeVal(ll, ll, ll);
void query(ll, ll, ll, ll, ll, ll&);

int main() {

    read();

    for(ll q, x, y, ans; m-- && fi >> q >> x >> y; ans = 0)
        if(q == 1)
            update(0, 0, n - 1, x - 1, y);
        else
        ans = 0, query(0, 0, n - 1, x - 1, y - 1, ans), fo << ans << nl;
    return 0;
}

void update(cll index, cll l, cll r, cll pos, cll val) {

    if(l == r)
        return void(aint[index] = val);

    cll mij = (l + r) / 2;

    if(pos <= mij)
        update(leftChild, l, mij, pos, val);
    else
        update(rightChild, mij + 1, r, pos, val);

    updateNodeVal(index, l, r);
}

void updateNodeVal(const ll index, const ll l, const ll r) {

    aint[index] = max(aint[leftChild], aint[rightChild]);
}

void read() {

    fi >> n >> m;
    aint.resize(2 * n - 1);

    for(int i = 0, a; i < n && fi >> a; ++i)
        update(0, 0, n - 1, i, a);
}

auto query(cll index, cll l, cll r, cll ql, cll qr, ll& ans)->void{

    if(ql <= l && r <= qr)
        return void(ans = max(ans, aint[index]));

    cll mij = (l + r) / 2;

    if(mij >= ql)
        query(leftChild, l, mij, ql, qr, ans);
    if(mij < qr)
        query(rightChild, mij + 1, r, ql, qr, ans);
}