Cod sursa(job #3322677)

Utilizator NeamtuMateiNeamtu Matei-Constantin NeamtuMatei Data 15 noiembrie 2025 10:54:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;

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

const int MAXN = 1e5;

int task, n, x, nrQ, a, b;
int aint[4*MAXN + 1];

int max(int a, int b) { return (a > b ? a : b); }


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


int query(int a, int b, int nod, int st, int dr) {
    int maxSt = 0, maxDr = 0;
    
    if (st <= a && b <= dr)
        return aint[nod];
    
    int mid = (a + b) / 2;
    if (st <= mid)
        maxSt = query(a, mid, nod * 2, st, dr);
    
    if (mid < dr)
        maxDr = query(mid + 1, b, nod * 2 + 1, st, dr);
    
    return max(maxSt, maxDr);
}


int main() {
    in >> n >> nrQ;
    for (int i = 1; i <= n; i++) {
        in >> x;
        update(1, n, 1, i, x);
    }
    
    for (int i = 1; i <= nrQ; i++) {
        in >> task >> a >> b;
        
        if (task == 0)
            out << query(1, n, 1, a, b) << '\n';
        else
            update(1, n, 1, a, b);
    }

    return 0;
}