Cod sursa(job #3353076)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 4 mai 2026 15:13:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int nmax = 100000;

int v[nmax + 5];

int a[4 * nmax + 5];

void build(int nod, int st, int dr) {
    if (st==dr) {
        a[nod]=  v[st];
        return;
    }
    int mid = (st+dr) /2;
    build(nod*2, st , mid);
    build(nod * 2 + 1, mid +1, dr);
    a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
}
void update(int nod, int st, int dr,int poz, int val)
{
    if (st==dr) {
        a[nod] = val;
        return;
    }
    int mid = (st+dr)/2;
    if (poz <= mid) update(nod * 2, st , mid, poz, val);
    else update(nod * 2 + 1, mid + 1, dr , poz , val);
    a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
}
int query(int nod, int st, int dr, int l, int r)
{
    if (l <= st && dr <=r)
        return a[nod];
    int mid = (st+dr) /2;
    int mx = -1;
    if (l <= mid) mx = max(mx, query(nod * 2, st, mid, l, r));
    if (r > mid) mx = max(mx, query(nod * 2 + 1, mid + 1, dr, l ,r));
    return mx;
}

int main()
{
    int n, m;
    fin>>n>>m;
    for (int i = 1; i <= n; i++)
        fin>>v[i];
    build(1,1,n);
    for (int i = 1; i <= m; i++) {
        int t;
        fin>>t;
        if (!t) {
            int st,dr;
            fin>>st>>dr;
            fout<<query(1,1,n, st, dr)<<'\n';
            continue;
        }
        int poz, val;
        fin>>poz>>val;
        update(1,1,n,poz,val);
    }
}