Cod sursa(job #3177643)

Utilizator Mihai_OctMihai Octavian Mihai_Oct Data 29 noiembrie 2023 17:42:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

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

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

        Build(st     , mij, 2 * nod    );
        Build(mij + 1, dr , 2 * nod + 1);

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

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

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

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

static inline int Query(int st, int dr, int nod) {
    if(qx <= st && dr <= qy) return v[nod];
    else {
        int mij = st + (dr - st) / 2;

        if(qy      <= mij) return Query(st     , mij, 2 * nod);
        if(mij + 1 <=  qx) return Query(mij + 1, dr , 2 * nod + 1);

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

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

    Build(1, n, 1);
    while(t--) {
        fin >> op;
        if(op == 0) {
            fin >> qx >> qy;   /// pt ca qa si qb sunt naspa
            fout << Query(1, n, 1) << "\n";
        }
        else {
            fin >> poz >> val;
            Update(1, n, 1);
        }
    }

    return 0;
}