Cod sursa(job #3288575)

Utilizator Mihai_999Diaconeasa Mihai Mihai_999 Data 22 martie 2025 20:30:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#define nl '\n'

using namespace std;

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

const int NMAX = 1e5+5;

int n, v[NMAX], aint[4*NMAX];

void build(int node, int low, int high)
{
    if (low == high)
        aint[node] = v[low];
    else
    {
        int mid = (low+high)>>1;
        build(2*node, low, mid);
        build(2*node+1, mid+1, high);
        aint[node] = max(aint[2*node], aint[2*node+1]);
    }
    return;
}

int query(int node, int low, int high, int a, int b)
{
    if (a <= low && high <= b)
        return aint[node];
    int mid = (low+high)>>1, t1 = 0, t2 = 0;
    if (a <= mid)
        t1 = query(2*node, low, mid, a, b);
    if (mid+1 <= b)
        t2 = query(2*node+1, mid+1, high, a, b);
    return max(t1, t2);
}

void update(int node, int low, int high, int poz, int val)
{
    if (low == high)
        aint[node] = val;
    else
    {
        int mid = (low+high)>>1;
        if (poz <= mid)
            update(2*node, low, mid, poz, val);
        if (mid+1 <= poz)
            update(2*node+1, mid+1, high, poz, val);
        aint[node] = max(aint[2*node], aint[2*node+1]);
    }
    return;
}

int main()
{
    int t;
    fin >> n >> t;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
    build(1, 1, n);
    while (t--)
    {
        int c, x, y;
        fin >> c >> x >> y;
        if (c == 0)
            fout << query(1, 1, n, x, y) << nl;
        else
            update(1, 1, n, x, y);
    }
    return 0;
}