Cod sursa(job #2853458)

Utilizator andrei81Ragman Andrei andrei81 Data 20 februarie 2022 12:08:35
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int maxN = 100005;
int Arb[4 * maxN], v[maxN], n, op, x, y, q;

void build(int node, int x, int y)
{
    if ( x == y )
    {
        Arb[node] = v[x];
        return;
    }

    int fiu = 2 * node, mid = (x + y) / 2;

    build(fiu, x, mid);
    build(fiu + 1, mid + 1, y);

    Arb[node] = max(Arb[fiu], Arb[fiu + 1]);
}

void update(int node, int x, int y, int pos, int val)
{
    if ( x > pos || y < pos )
        return;

    if ( x == y )
    {
        Arb[node] = val;
        return;
    }

    int fiu = 2 * node, mid = (x + y) / 2;

    update(fiu, x, mid, pos, val);
    update(fiu + 1, mid + 1, y, pos, val);

    Arb[node] = max(Arb[fiu], Arb[fiu + 1]);
}

int query(int node, int x, int y, int st, int dr)
{
    if ( x > dr || y < st )
        return -2e9;

    if ( st <= x && y <= dr )
        return Arb[node];

    int fiu = 2 * node, mid = (x + y) / 2;

    return max(query(fiu, x, mid, st, dr),
        query(fiu + 1, mid + 1, y, st, dr));
}

int main()
{
    fin >> n >> q;

    for ( int i = 1; i <= n; i++ )
        fin >> v[i];

    build(1, 1, n);
    // cout << query(1, 1, 2, 2, 2);
    // return 0;

    for ( int i = 1; i <= q; i++ )
    {
        fin >> op >> x >> y;

        if ( op == 0 )
            fout << query(1, 1, n, x, y) << "\n";
        else
            update(1, 1, n, x, y);
    }
}