Cod sursa(job #3041885)

Utilizator runaMurgu Andrei runa Data 2 aprilie 2023 12:38:18
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>

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


int tree[400005], array[100001];
void build(int node, int left, int right) {
    if (left == right)
        tree[node] = array[left];
    else {
        int mid = (left + right) / 2;
        build(2*node, left, mid);
        build(2 * node + 1, mid + 1, right);

        tree[node] = std::max(tree[node * 2], tree[2 * node + 1]);

    }
   
}

void update(int node, int left, int right, int pos, int newValue) {
    if (left == right) 
        tree[node] = newValue;
    else {
        int mid = (left + right) / 2;
        if (pos <= mid)
            update(2 * node, left, mid, pos, newValue);
        else
            update(2 * node + 1, mid + 1, right, pos, newValue);
        tree[node] = std::max(tree[2 * node], tree[2 * node + 1]);
        

    }
}

int query(int node, int left, int right, int ql, int qr) {
    if (ql <= left && right <= qr)
        return tree[node];
    else {
        int mid = (right + left) / 2;
        if (qr <= mid) 
            return query(2 * node, left, mid, ql, qr);
        if (mid + 1 <= ql)
            return query(2 * node, mid + 1, right, ql, qr);
        
    }
}
int main()
{
    int n, m;

    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> array[i];
    }
    build(1, 1, n);
    int a, b, c;


    for (int i = 1; i <= m; i++) {
        fin >> a >> b >> c;
        if (a == 0) {
            fout << query(1, 1, n, b, c) << std::endl;
        }
        else
            update(1, 1, n, b, c);
    }
}