Cod sursa(job #3235427)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 17 iunie 2024 20:23:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

const int NMAX = 1e5;
int aint[4 * NMAX + 1];
int v[NMAX + 1];
int sol = 0;

void build(int nod, int st, int dr) {
    if(st == dr) {
        aint[nod] = v[st]; // sau v[dr], ambele merg
    } else {
        int mid = (st + dr) / 2;
        build(2 * nod, st, mid);
        build(2 * nod + 1, mid + 1, dr);
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
    }
}

void update(int nod, int st, int dr, int pos, int val) {
    if(st == dr) {
        aint[nod] = val;
    } else {
        int mid = (st + dr) / 2;
        if(pos <= mid) {
            update(2 * nod, st, mid, pos, val);
        } else {
            update(2 * nod + 1, mid + 1, dr, pos, val);
        }
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
    }
}

void query(int nod, int st, int dr, int a, int b) {
    if(a <= st && dr <= b) {
        sol = max(sol, aint[nod]);
    } else {
        int mid = (st + dr) / 2;
        //[st, mid]
        if(mid >= a) {
            query(2 * nod, st, mid, a, b);
        }
        //[mid + 1, dr]
        if(mid + 1 <= b) {
            query(2 * nod + 1, mid + 1, dr, a, b);
        }
    }
}

int main() {
    int n, m;
    f >> n >> m;
    for(int i = 1; i <= n; i++) {
        f >> v[i];
    }
    build(1, 1, n);
    for(int i = 1; i <= m; i++) {
        int op, a, b;
        f >> op >> a >> b;
        if(op == 0) {
            sol = 0;
            query(1, 1, n, a, b);
            g << sol << '\n';
        } else {
            update(1, 1, n, a, b);
        }

    }
    return 0;
}