Cod sursa(job #2752586)

Utilizator blxqnAlina Voiculescu blxqn Data 18 mai 2021 17:40:06
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int arbint[500001], vec[100001];

void build(int node, int left, int right)
{
    if(left == right)
        arbint[node] = vec[left];
    else
    {
        int middle = (left + right) / 2;
        build(2 * node, left, middle);
        build(2 * node + 1, middle + 1, right);
        arbint[node] = max(arbint[2 * node], arbint[2 * node + 1]);
    }
}

void update(int node, int value, int pos, int left, int right)
{
    if (left == right)
        arbint[node] = value;
    else
    {
        int middle = (left + right) / 2;
        if (pos <= middle)
            update(2 * node, value, pos, left, middle);
        else
            update(2 * node + 1, value, pos, middle + 1, right);
        arbint[node] = max(arbint[2 * node], arbint[2 * node + 1]);
    }
}

int query(int node, int left1, int right1, int left2, int right2)
{
    if (left1 <= left2 && right2 <= right1)
        return arbint[node];
    else
    {
        int middle = (left2 + right2) / 2;
        int subarbleft = 0, subarbright = 0;
        if (left1 <= middle)
            subarbleft = query(2 * node, left1, right1, left2, middle);
        if (right1 > middle)
            subarbright = query(2 * node + 1, left1, right1, middle + 1, right2);
        return max(subarbleft, subarbright);
    }
}

int main()
{
    int n, m;
    fin>>n>>m;
    for(int i = 1; i <= n; i++)
        fin>>vec[i];
    build(1, 1, n);
    for (int i = 1; i <= m; i++)
    {
        int option, a, b;
        fin>>option>>a>>b;
        if (option == 0)
            fout<<query(1, a, b, 1, n)<<"\n";
        else if (option == 1)
            update(1, b, a, 1, n);
    }
    return 0;
}