Cod sursa(job #2751855)

Utilizator oporanu.alexAlex Oporanu oporanu.alex Data 15 mai 2021 22:57:23
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int arbint[400005], A[100005];

int build(int start, int eend, int nod){
    if (start == eend)
        {
        arbint[nod] = A[start];
        return A[start];
        }

    int mid = (start + eend)/2;
    arbint[nod] = max(build(start, mid, nod * 2 + 1), build(mid + 1, eend, nod * 2 + 2));
    return arbint[nod];

}
void update(int i, int stanga, int dreapta, int nod, int nou)
{
    if (i < stanga || i > dreapta)
        return;
    if (stanga == dreapta){
        arbint[nod] = nou;
        return;
    }


    if(stanga != dreapta)   /// adica am fii
        update(i, stanga, (stanga + dreapta)/2, nod * 2 + 1, nou);
        update(i, (stanga + dreapta) / 2 + 1, dreapta, nod * 2 + 2, nou);

    arbint[nod] = max(arbint[2 * nod + 1], arbint[2 * nod + 2]);
}

int getmax(int i, int j, int nod, int seg_stanga, int seg_dreapta){
    if (i <= seg_stanga && j >= seg_dreapta)
        {
            return arbint[nod];
        }

    if (seg_dreapta < i || seg_stanga > j)
		    return INT_MIN;

    int mid = (seg_stanga + seg_dreapta) / 2;
    return max(getmax(i, j, 2 * nod + 1, seg_stanga, mid), getmax(i, j, 2 * nod + 2, mid + 1, seg_dreapta));

}

int main()
{


    int N, M;

    f >> N >> M;

    for (int i = 0; i < N; ++i)
        f >> A[i];
    int a, b, optiune;

    build(0, N - 1, 0);
    for (int i = 0; i < M; ++i)
        {
            f >> optiune >> a >> b;
            if (optiune == 0)
                g << getmax(a - 1, b -1, 0, 0, N - 1) << "\n";
            else
                update(a - 1, 0, N - 1, 0, b);
            }

    return 0;
}