Cod sursa(job #2388849)

Utilizator andrei42Oandrei42O andrei42O Data 26 martie 2019 16:31:21
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 1<<18;
int n, m, aint[N], st, dr, tip, i, v, z, get_max(int, int, int);
void upd(int, int);
int main()
{
    f >> n >> m;
    z = 1;
    while(z < n)
        z*=2;
    z--;
    for(int i = 1; i <= n; i++)
        f >> aint[z + i];
    for(int i = z; i >= 1; i--)
        aint[i] = max(aint[2*i], aint[2*i + 1]);
    for(; m; m--)
    {
        f >> tip;
        if(!tip)
        {
            f >> st >> dr;
            g << get_max(1, 1, z+1) << '\n';
            continue;
        }
        f >> i >> v;
        upd(i+z, v);
    }
    return 0;
}
int get_max(int nod,int lo,int hi)
{
    /// [lo,hi] = intervalul controlat de nod
    /// [st,dr] = intervalul chestionat ( st si dr globale )
    if(lo>dr||st>hi) return 0;
    if(st<=lo&&hi<=dr)return aint[nod];
    int mi=(lo+hi)/2;
    return max(get_max(2*nod,lo,mi),get_max(2*nod+1,mi+1,hi));
}
void upd(int nod,int val)
{
    aint[nod]=val;
    for(nod/=2;nod;nod/=2)aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}