Cod sursa(job #2860505)

Utilizator radu.Radu Cristi radu. Data 2 martie 2022 18:21:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#define NMAX 300005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M;
int a[NMAX];
void update(int node, int left, int right, int poz, int val) {
    if (left == right) {
        a[node] = val;
        return;
    }
    int ls = 2 * node, rs = 2 * node + 1;
    int mid = (left + right) / 2;
    if (left <= poz && poz <= mid) {
        update(ls, left, mid, poz, val);
    }
    else {
        update(rs, mid + 1, right, poz, val);
    }
    a[node] = max(a[ls], a[rs]);
}
int query(int node, int left, int right, int lpoz, int rpoz) {
    if (lpoz == left && rpoz == right) {
        return a[node];
    }
    int ls = 2 * node, rs = 2 * node + 1;
    int mid  = (left + right) / 2;
    if (left <= lpoz && rpoz <= mid) {
        return query(ls, left, mid, lpoz, rpoz);
    }
    if (mid + 1 <= lpoz && rpoz <= right) {
        return query(rs, mid + 1, right, lpoz, rpoz);
    }
    return max(query(ls, left, mid, lpoz, mid), query(rs, mid + 1, right, mid + 1, rpoz));
}
void read() {
    fin >> N >> M;
    int nr;
    for (int i = 1; i <= N; ++i) {
        fin >> nr;
        update(1, 1, N, i, nr);
    }
}
int main()
{
    read();
    int t, a, b;
    for (int i = 1; i <= M; ++i) {
        fin >> t >> a >> b;
        if (t == 1) {
            update(1, 1, N, a, b);
        }
        else {
            fout << query(1, 1, N, a, b) << "\n";
        }
    }
    fout << "\n";
    return 0;
}