Cod sursa(job #2906646)

Utilizator maiaauUngureanu Maia maiaau Data 26 mai 2022 21:19:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
using namespace std;

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

const int N = 1 << 18;
const int mn = -1;

int16_t c;
int arb[N], a, b, n, m, z, i;

int getmax(int, int, int);
void modif();

int main()
{
    f >> n >> m;

    z = 1;
    while(z < n) z *= 2;
    z--;

    for(i = 1; i <= n; i++)
        f >> arb[i + z];
    for(i = z + n + 1; i <= 2 * z + 2; i++)
        arb[i] = mn;

    for(i = z; i; i--)
        arb[i] = max(arb[2 * i], arb[2 * i + 1]);

    for (; m; m--)
    {
        f >> c >> a >> b;
        if(c == 0) g << getmax(1, 1, z + 1) << '\n';
        else
            modif();

    }
    return 0;
}

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

void modif(){
    int k = z + a;
    arb[k] = b;
    while(k){
        k /= 2;
        arb[k] = max(arb[2 * k], arb[2 * k + 1]);
    }
}