Cod sursa(job #3356449)

Utilizator albu-sebastianAlbu Sebastian albu-sebastian Data 1 iunie 2026 13:35:00
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>

using namespace std;

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

#define MAX 100005
int a[MAX];
int arbint[4 * MAX];

void build(int nod, int st, int dr)
{
    if (st == dr)
    {
        arbint[nod] = a[st];
        return;
    }
    int mid = st + (dr - st) / 2;
    build(2 * nod, st, mid);
    build(2 * nod + 1, mid + 1, dr);
    
    arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}

void update(int nod, int st, int dr, int poz, int val)
{
    if (st == dr)
    {
        arbint[nod] = val;
        return;
    }
    int mid = st + (dr - st) / 2;
    
    if (poz <= mid) update(2 * nod, st, mid, poz, val);
    else update(2 * nod + 1, mid + 1, dr, poz, val);

    arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}

int query(int nod, int st, int dr, int a, int b)
{
    if (a <= st && dr <= b) return arbint[nod];
    
    int mid = st + (dr - st) / 2;
    int max_st = -1, max_dr = -1;
    
    if (a <= mid) max_st = query(2 * nod, st, mid, a, b);
    if (b > mid) max_dr = query(2 * nod + 1, mid + 1, dr, a, b);
    
    return max(max_st, max_dr);
}

int main(void)
{
    int n, m, x, y, op;

    fin >> n >> m;

    for (int i=1; i <= n; i++) fin >> a[i]; //indexam de la 1

    build(1, 1, n);

    for (int i=0; i < m; i++)
    {
        fin >> op >> x >> y;

        if (!op) fout << query(1, 1, n, x, y) << endl;
        else update(1, 1, n, x, y);
    }
    
    return 0;
}