Cod sursa(job #3342193)

Utilizator ioanabaduIoana Badu ioanabadu Data 23 februarie 2026 12:07:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <climits>
#define NMAX 100005

using namespace std;

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

int n, queries;
int arr[NMAX], aint[NMAX*2];

void create (int idx, int a, int b){
    if (a == b){
        aint[idx] = arr[a];
        return;
    }

    int mid = (a+b)/2;
    create(idx*2, a, mid);
    create(idx*2+1, mid+1, b);

    aint[idx] = max(aint[idx*2], aint[idx*2+1]);
}

int query (int idx, int a, int b, int valA, int valB){
    if (b < valA || a > valB)
        return INT_MIN;
    if (a >= valA && b <= valB)
        return aint[idx];

    int mid = (a+b)/2;
    return max(query(idx*2, a, mid, valA, valB), query(idx*2+1, mid+1, b, valA, valB));
}

void update (int idx, int a, int b, int val, int valIdx){
    if (a == b){
        aint[idx] = val;
        return;
    }

    int mid = (a+b)/2;
    if (valIdx <= mid)
        update(idx*2, a, mid, val, valIdx);
    else
        update(idx*2+1, mid+1, b, val, valIdx);

    aint[idx] = max(aint[idx*2], aint[idx*2+1]);
}

int main (){
    int op, a, b;

    in >> n >> queries;
    for (int i=1; i<=n; ++i)
        in >> arr[i];

    create(1, 1, n);
    while (queries--){
        in >> op >> a >> b;

        if (op == 0)
            out << query(1, 1, n, a, b) << '\n';
        else
            update(1, 1, n, b, a);
    }

    return 0;
}