Cod sursa(job #3291969)

Utilizator calinarulMarinescu Calin calinarul Data 6 aprilie 2025 15:14:57
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>
#define NMAX 100000
#define endl '\n'
#define optimize ios::sync_with_stdio(false);cin.tie(NULL);
using namespace std;
const int Lungime = NMAX * 4 + 99;
int v[NMAX];
int aint[Lungime];
int mx(int a, int b)
{
    if (a > b)
        return a;
    return b;
}
void build(int node, int st, int dr)
{
    if (st == dr)
    {
        aint[node]=v[st];
        return;
    }
    int mid = (st + dr) / 2;
    build(2 * node, st, mid);
    build(2 * node + 1, mid + 1, dr);
    aint[node] = mx(aint[2 * node] , aint[2 * node + 1])    ;
}
void update(int pos, int val, int node, int st, int dr)
{
    if (st == dr)
    {
        aint[node] = val;
        return;
    }
    int mid = (st + dr) / 2;
    if (pos <= mid)
    {
        update(pos, val, 2 * node, st, mid);
    }
    else
        update(pos, val, 2 * node + 1, mid + 1, dr);
    aint[node] = mx(aint[2 * node + 1], aint[2 * node]);
}
int query(int x, int y, int node, int st, int dr)
{
    if (dr < x || y < st)
    {
        return 0;
    }
    if (x <= st && dr <= y)
    {
        return aint[node];
    }
    int mid = (st + dr) / 2;
    int qst = query(x, y, 2 * node, st, mid);
    int qdr = query(x, y, 2 * node + 1, mid + 1, dr);
    return mx(qst,qdr);
}
int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    optimize
    int n;
    int t;
    cin >> n >> t;
    for (int i = 1; i <= n; i++)
    {
        cin>>v[i];
    }
    build(1, 1, n);
    while (t--)
    {
        int op, st, dr;
        cin >> op >> st >> dr;
        if (op)
        {
            update(st, dr, 1, 1, n);
        }
        else
        {
            cout << query(st, dr, 1, 1, n) << endl;
        }
    }
}