Cod sursa(job #2979030)

Utilizator 100pCiornei Stefan 100p Data 14 februarie 2023 18:47:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

#define MAX 100000
#define int long long

using namespace std;

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

int n, m, v[MAX + 5], typ, a, b;
int tree[MAX * 4 + 5];

void update(int st, int dr, int node, int pos, int val)
{
    if(st == dr)
    {
        tree[node] = val;
        return;
    }

    int mid = (st + dr) >> 1;
    if(pos <= mid)
        update(st, mid, (node << 1) + 1, pos, val);
    else
        update(mid + 1, dr, (node << 1) + 2, pos, val);

    tree[node] = max(tree[(node<<1)+1], tree[(node<<1)+2]);
}

int query(int st, int dr, int node, int x, int y)
{
    if(st >= x && y >= dr)
        return tree[node];

    int mid = (st + dr) >> 1, val = 0;
    if(x <= mid)
        val = max(val, query(st, mid, (node << 1) + 1, x, y));
    if(mid < y)
        val = max(val, query(mid + 1, dr, (node << 1) + 2, x, y));

    return val;

}

signed main()
{
    fin >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        fin >> v[i];
        update(1, n, 0, i, v[i]);
    }

    for(int i = 1; i <= m; ++i)
    {
        fin >> typ >> a >> b;
        if(typ)
            update(1, n, 0, a, b);
        else
            fout << query(1, n, 0, a, b) << '\n';
    }
}