Cod sursa(job #2570881)

Utilizator andrei42Oandrei42O andrei42O Data 4 martie 2020 19:48:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 1 << 18;
int n, m, z, p, c, a, b, v[N], getMax(int, int, int);
int main()
{
    f >> n >> m;
    p = 1;
    for(; p < n; p*=2);
    z = p - 1;
    for(int i = 1; i <= n; i++)
        f >> v[z + i];
    for(int i = z; i >= 1; i--)
        v[i] = max(v[i * 2], v[i * 2 + 1]);
    for(; m; m--)
    {
        f >> c >> a >> b;
        if(c)
        {
            v[z + a] = b;
            for(int i = (z + a) / 2; i >= 1; i /= 2)
                v[i] = max(v[2 * i + 1], v[2 * i]);
            continue;
        }
        g << getMax(1, 1, p) << '\n';
    }

    return 0;
}
int getMax(int nod, int st, int dr)
{
    if(b < st || a > dr)
        return 0;
    if(st >= a && dr <= b)
        return v[nod];
    int mi = (st + dr) / 2;
    return max(getMax(nod * 2, st, mi), getMax(nod * 2 + 1, mi + 1, dr));
}