Cod sursa(job #3180641)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 5 decembrie 2023 18:14:55
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

struct SegTree {
    int n;
    vector <int> v;
    int query(int nod, int st, int dr, int qst, int qdr) {
        if (qst <= st && dr <= qdr) {
            return v[nod];
        }
        int med = (st + dr) / 2, ans = -1;
        if (qst <= med) {
            ans = max(ans, query(2 * nod, st, med, qst, qdr));
        }
        if (med < qdr) {
            ans = max(ans, query(2 * nod + 1, med + 1, dr, qst, qdr));
        }
        return ans;
    }
    int query(int st, int dr) {
        return query(1, 1, n, st, dr);
    }
    void update(int nod, int st, int dr, int poz, int val) {
        if (st == dr) {
            v[nod] = val;
            return;
        }
        int med = (st + dr) / 2;
        if (poz <= med) {
            update(2 * nod, st, med, poz, val);
        }
        else {
            update(2 * nod + 1, med + 1, dr, poz, val);
        }
        v[nod] = max(v[2 * nod], v[2 * nod + 1]);
    }
    void update(int poz, int val) {
        update(1, 1, n, poz, val);
    }
    void build(int nod, int st, int dr, vector <int> &a) {
        if (st == dr) {
            v[nod] = a[st];
            return;
        }
        int med = (st + dr) / 2;
        build(2 * nod, st, med, a);
        build(2 * nod + 1, med + 1, dr, a);
        v[nod] = max(v[2 * nod], v[2 * nod + 1]);
    }
    void build(vector <int> &a) {
        build(1, 1, n, a);
    }
    SegTree(int _n) {
        n = _n;
        v.resize(4 * n + 1, 0);
    }
};

int main()
{
    int n, q;
    fin >> n >> q;
    vector <int> v(n + 1);
    for (int i = 1; i <= n; i++) {
        fin >> v[i];
    }
    SegTree aint(n);
    aint.build(v);
    while (q--) {
        int op, x, y;
        fin >> op >> x >> y;
        if (op == 0) {
            fout << aint.query(x, y) << '\n';
        }
        if (op == 1) {
            aint.update(x, y);
        }
    }
    return 0;
}