Cod sursa(job #2750841)

Utilizator alexbrinzaAlexandru Brinza alexbrinza Data 13 mai 2021 13:35:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int n, m, x, task, y;

class arbint{
    int const static MAX = 100005;
    int tree[4 * MAX];

public:

    void Insert(int node, int left, int right, int pos, int val)
    {
        if(left == right)
        {
            tree[node] = val;
            return;
        }

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

        if(pos <= middle) Insert(node * 2, left, middle, pos, val);
        else Insert(node * 2 + 1, middle + 1, right, pos, val);

        tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
    }

    int FindMax(int node, int left, int right, int a, int b)
    {
        if(a <= left && right <= b) return tree[node];

        int val_max = -1;
        int middle = left + (right - left) / 2;

        if(a <= middle) val_max = max(val_max, FindMax(node * 2, left, middle, a, b));
        if(middle < b) val_max = max(val_max, FindMax(node * 2 + 1, middle + 1, right, a, b ));

        return val_max;
    }
};

arbint A;

void read()
{
    in >> n >> m;

    for(int i = 1; i <= n; ++i)
    {
        in >> x;
        A.Insert(1, 1, n, i, x);
    }


    for(int i = 1; i <= m; ++i)
    {
        in >> task >> x >> y;

        if(task == 0) out << A.FindMax(1, 1, n, x, y) << "\n";
        else A.Insert(1, 1, n, x, y);
    }
}

int main()
{
    read();
    return 0;
}