Cod sursa(job #2794776)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 5 noiembrie 2021 13:42:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
#define NMAX 100005

using namespace std;

/*********************************/
/// INPUT / OUTPUT

ifstream f("arbint.in");
ofstream g("arbint.out");
/*********************************/
/// GLOBAL DECLARATIONS

int N, M;
int v[NMAX];
int arb[4 * NMAX];
/*********************************/
/// FUNCTIONS

void ReadInput();
void Solution();
/*********************************/
///------------------------------------------
void Update(int left, int right, int node, int pos)
{
    if (left == right)
    {
        arb[node] = v[pos];
        return;
    }

    int mid = (right - left) / 2 + left;

    if (pos <= mid) Update(left, mid, 2 * node, pos);
    else Update(mid + 1, right, 2 * node + 1, pos);
    arb[node] = max(arb[2 * node], arb[2 * node + 1]);
}
///------------------------------------------
inline void ReadInput()
{
    f >> N >> M;

    for (int i = 1 ; i <= N ; ++ i)
    {
        f >> v[i];
        Update(1, N, 1, i);
    } 
}
///------------------------------------------
int Query(int arbLeft, int arbRight, int left, int right, int node)
{
    if (arbLeft > right || arbRight < left) return -1;

    if (left <= arbLeft && right >= arbRight) return arb[node];

    int mid = (arbRight - arbLeft) / 2 + arbLeft;

    int leftAns = Query(arbLeft, mid, left, right, 2 * node);
    int rightAns = Query(mid + 1, arbRight, left, right, 2 * node + 1);

    return max(leftAns, rightAns);
}
///------------------------------------------
inline void Solution()
{
    for (int i = 1 ; i <= M ; ++ i)
    {
        int cer, a, b;
        f >> cer >> a >> b;

        if (cer == 0) g << Query(1, N, a, b, 1) << "\n";
        else
        {
            v[a] = b;
            Update(1, N, 1, a);
        }
    }
}
///------------------------------------------
int main()
{
    ReadInput();
    Solution();
}