Cod sursa(job #3128575)

Utilizator Maftei_TudorMaftei Tudor Maftei_Tudor Data 9 mai 2023 22:57:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>

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

int n, q, tip, a, b, v[100001], tree[200001];

void build(int nod, int left, int right) {
    if(left == right) {
        tree[nod] = v[left];
        return;
    }

    int mid = (left + right) / 2;
    build(2*nod, left, mid);
    build(2*nod+1, mid+1, right);

    tree[nod] = max(tree[2*nod], tree[2*nod+1]);

    return;
}

void update(int nod, int left, int right, int pos, int val) {
    if(left == right) {
        tree[nod] = val;
        return;
    }

    int mid = (left + right) / 2;
    if(pos <= mid)
        update(2*nod, left, mid, pos, val);
    else update(2*nod+1, mid+1, right, pos, val);

    tree[nod] = max(tree[2*nod], tree[2*nod+1]);

    return;
}

int query(int nod, int left, int right, int x, int y) {
    if(left >= x && right <= y)
        return tree[nod];

    int mid = (left + right) / 2, qst = 0, qdr = 0;
    if(mid >= x)
        qst = query(2*nod, left, mid, x, y);
    if(mid < y)
        qdr = query(2*nod+1, mid+1, right, x, y);

    return max(qst, qdr);
}

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

    build(1, 1, n);

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