Cod sursa(job #2977841)

Utilizator C_R_I_S_T_I_2_3Cristi Gavrila C_R_I_S_T_I_2_3 Data 12 februarie 2023 15:26:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
int v[300000];
inline void Citire()
{
    fin >> n >> m;
    int p = 1;
    while(p < n)
        p = p*2;
    for(int i = p; i < p + n; i ++)
        fin >> v[i];
    n = p;
    for(int i = n - 1; i >= 1; i --)
    {
        v[i] = max(v[2 * i], v[2 * i + 1]);
    }
}
int Query(int nod, int x, int y, int st, int dr)
{
    if(st == x && dr == y)
        return v[nod];
    else
    {
        int mij = (st + dr)/2;
        if(y <=  mij)
            return Query(2 * nod, x, y, st, mij);
        else if(x >= mij + 1)
            return Query(2 * nod + 1, x, y, mij + 1, dr);
        else
            return max(Query(2 * nod, x, mij, st, mij), Query(2 * nod + 1, mij + 1, y, mij + 1, dr));
    }
}

void Update(int nod, int a)
{
    nod = n + nod - 1;
    v[nod] = a;
    int t;
    while(nod)
    {
        t = nod / 2;
        v[t] = max(v[t * 2], v[t * 2 + 1]);
        nod = t;
    }
}
int main()
{
    Citire();
    for(int i = 1; i <= m; i ++)
    {
        int val, a, b;
        fin >> val >> a >> b;
        if(val == 0)
            fout << Query(1, a, b, 1, n) << "\n";
        else
            Update(a, b);
    }
    return 0;
}