Cod sursa(job #3150367)

Utilizator Robilika2007Robert Badea Robilika2007 Data 16 septembrie 2023 03:38:23
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define MAX_N 131072
//#define MAX_N 8

int tree[MAX_N * 2];

int f(int node, int node_low, int node_high, int querry_low, int querry_high)
{
    if(querry_low <= node_low && node_high <= querry_high) //apartine total intervalului
    {
        return tree[node];
    }
    if(node_high < querry_low || querry_high < node_low) //nu se intersecteaza deloc cu intervalul
    {
        return -1;
    }

    int last_in_left = (node_low + node_high) / 2;

    return max(f(node * 2, node_low, last_in_left, querry_low, querry_high),
     f(node * 2 + 1, last_in_left + 1, node_high, querry_low, querry_high));
}

void s(int node)
{
    tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
    if(node == 1)
    {
        return;
    }
    s(node / 2);
}

int main()
{
    int n, m, c, a, b;
    in >> n >> m;
    for(int i = 0; i < n; ++i)
    {
        in >> tree[MAX_N + i];
    }

    for(int i = MAX_N - 1; i > 0; --i) // creem arborele
    {
        tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
    }

    for(int i = 0; i < m; ++i)
    {
        in >> c >> a >> b;
        if(c == 0)
        {
            out << f(1, 0, MAX_N - 1, a - 1, b - 1) << '\n';
        } else
        {
            tree[MAX_N + a - 1] = b;
            s((MAX_N + a - 1) / 2);
        }
    }
/*
    for(int i = 1; i < MAX_N * 2; ++i)
        cout << tree[i] << " ";
*/
    return 0;
}