Cod sursa(job #2789270)

Utilizator florinrafiliuRafiliu Florin florinrafiliu Data 27 octombrie 2021 11:47:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

const int maxN = 1e5 + 5;

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

int arb[4*maxN];
int v[maxN];


void build (int k, int st, int dr) {
    if(st == dr)
        arb[k] = v[st];
    else {
        int mij = (st + dr) / 2;
        build(k*2, st, mij);
        build(k*2+1, mij+1, dr);
        arb[k] = max(arb[k*2], arb[k*2+1]);
    }

}

void update (int k, int st, int dr, int ind, int next) {
    if(st == dr)
        arb[k] = next;
    else {
        int mij = (st + dr) / 2;
        if(ind <= mij)
            update(k*2, st, mij, ind, next);
        else
            update(k*2+1, mij+1, dr, ind, next);

        arb[k] = max(arb[k*2], arb[k*2+1]);
    }
}

int maxim (int k, int st, int dr, int l, int r) {
    if(st > dr) return 0;
    if(st == l && dr == r) {
        return arb[k];
    } else {
        int mij = (st + dr) / 2;
        int ans1 = 0, ans2 = 0;

        if(l <= mij)
            ans1 = maxim(k*2, st, mij, l, min(mij, r));
        if(r > mij)
            ans2 = maxim(k*2+1, mij+1, dr, max(mij+1, l), r);

        return max(ans1, ans2);
    }
}

int main() {

    int n, m; fin >> n >> m;
    for(int i = 1; i <= n; ++i) {
        fin >> v[i];
    }

    build(1, 1, n);

    for(int i = 1; i <= m; ++i) {
        int op; fin >> op;
        int a, b; fin >> a >> b;
        if(op == 0) {
            fout << maxim(1, 1, n, a, b) << '\n';
        } else {
            update(1, 1, n, a, b);
        }
    }

    return 0;
}