Cod sursa(job #3299385)

Utilizator florin977Docheru Florin-Andrei florin977 Data 5 iunie 2025 20:00:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

#define max(A, B) ((A >= B) ? A : B)
#define MAX_DIM_INPUT 100000

vector<int> aint(4 * MAX_DIM_INPUT, 0);
int N, M;

void update(int root, int arrayPos, int left, int right, int value)
{
    if (left == right)
    {
        aint[root] = value;
        return;
    }

    int mid = (left + right) / 2;

    if (arrayPos <= mid)
    {
        update(2 * root, arrayPos, left, mid, value);
    }
    else 
    {
        update(2 * root + 1, arrayPos, mid + 1, right, value);
    }

    aint[root] = max(aint[2 * root], aint[2 * root + 1]);
}

int query(int root, int a, int b, int left, int right)
{

    if (a <= left && right <= b)
    {
        return aint[root];
    }

    int mid = (left + right) / 2;

    int maxim1 = -1;
    int maxim2 = -1;

    if (a <= mid)
    {
        maxim1 = query(2 * root, a, b, left, mid);
    }

    if (mid < b) 
    {
        maxim2 = query(2 * root + 1, a, b, mid + 1, right);
    }

    return max(maxim1, maxim2);
} 

int main()
{
    fin >> N >> M;

    for (int i = 1; i <= N; i++)
    {
        int value = 0;

        fin >> value;

        update(1, i, 1, N, value);
    }

    while (M > 0)
    {
        int type, a, b;

        fin >> type >> a >> b;

        if (type == 0)
        {
            fout << query(1, a, b, 1, N) << '\n';
        }
        else 
        {
            update(1, a, 1, N, b);
        }

        M--;
    }

    return 0;
}