Cod sursa(job #3144364)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 7 august 2023 16:27:45
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, q, i, a[400002], v[100002];
int poz, val, qx, qy, op;

static inline void setUp(int nod, int st, int dr) {
    if(st == dr) a[nod] = v[st];
    else {
        int mij = (st + dr) / 2;
        setUp(nod * 2, st, mij);
        setUp(nod * 2 + 1, mij + 1,  dr);
        a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
    }
}

static inline void update(int nod, int st, int dr) {
    if(st == dr) a[nod] = val;
    else {
        int mij = (st + dr) / 2;

        if(poz <= mij) update(nod * 2, st, mij);
        else update(nod * 2 + 1, mij + 1, dr);

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

static inline int query(int nod, int st, int dr) {
    if(qx <= st && dr <= qy) return a[nod];
    else {
        int mij = (st + dr) / 2;
        if(qy <= mij) return query(nod * 2, st, mij);
        if(mij + 1 <= qx) return query(nod * 2 + 1, mij + 1, dr);

        return max(query(nod * 2, st, mij),
                   query(nod * 2 + 1, mij + 1, dr));
    }
}

int main() {
    fin >> n >> q;
    for(i = 1; i <= n; i++) fin >> v[i];
    setUp(1, 1, n);
    while(q--) {
        fin >> op;
        if(op == 0) {
            fin >> qx >> qy;
            fout << query(1, 1, n) << "\n";
        }
        else {
            fin >> poz >> val;
            update(1, 1, n);
        }
    }

    return 0;
}