Cod sursa(job #2873586)

Utilizator Sebi_MafteiMaftei Sebastioan Sebi_Maftei Data 19 martie 2022 10:59:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;

/**
Intr-un arbore binar complet a radacina este a[1]
si pentru fiecare nod i informatia este memorata in a[i]
iar fiii sai (daca exista) sunt a[2*i] si a[2*i+1].
*/
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[510000], n;

void Update(int p, int x)
{
    int t;
    a[p] = x;
    while (p >= 1)
    {
        t = p / 2;
        a[t] = max(a[2 * t], a[2 * t + 1]);
        p = t;
    }
}

/**
p = nodul unde ne aflam (initial p=1, adica radacina)
[x,y] - intervalul in care vream sa aflam maximul
[st, dr] = intervalul reprezentat de nodul p
*/
int Query(int p, int x, int y, int st, int dr)
{
    if (x == st && y == dr) return a[p];
    int m = (st + dr) / 2;
    if (y <= m) return Query(2 * p, x, y, st, m);
    if (m + 1 <= x) return Query(2 * p + 1, x, y, m + 1, dr);
    /// sunt in cazul x <= m < y
    return max(Query(2 * p, x, m, st, m),
               Query(2 * p + 1, m + 1, y, m + 1, dr));
}

int main()
{
    int m, i, k, op, x, y;
    fin >> n >> m;
    /// aflu in k cea mai mica putere a lui 2 >= n
    for (k = 1; k < n; k = k * 2)
        ;
    for (i = k; i < k + n; i++)
        fin >> a[i];
    n = k;

    for (i = n - 1; i >= 1; i--)
        a[i] = max(a[2 * i], a[2 *i + 1]);

    while (m--)
    {
        fin >> op >> x >> y;
        if (op == 1) Update(n - 1 + x, y);
        else fout << Query(1, x, y, 1, n) << "\n";
    }
    fout.close();
    return 0;
}