Cod sursa(job #3004471)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 16 martie 2023 12:46:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <cmath>

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int nmax = 100000;
int v[nmax + 1];
int tree[3*nmax + 2];
int n,lastnode;

void build_tree(int l = 1, int r = lastnode, int node = 1)
{
    if(l == r && l <= n)
    {
        tree[node] = v[l];
        return;
    }
    if(l == r && l > n)
    {
        tree[node] = 0;
        return;
    }
    int med = (l + r) / 2;
    build_tree(l, med, 2 * node);
    build_tree(med + 1, r, 2 * node + 1);
    tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void update(int poza, int val, int l = 1, int r = lastnode, int node = 1)
{
    if(l == r)
    {
        tree[node] = val;
        return;
    }
    int med = (l + r) / 2;
    if(poza <= med)
        update(poza, val, l, med, 2 * node);
    else
        update(poza, val, med + 1, r, 2 * node + 1);
    tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
int search_interval(int searchl, int searchr, int l = 1, int r = lastnode, int node = 1)
{
    int maxi = -1;
    if(searchl <= l && searchr >= r)
    {
        return tree[node];
    }
    int med = (l + r) / 2;
    if(searchl <= med)
        maxi = max(maxi, search_interval(searchl, searchr, l, med, 2 * node));
    if(searchr > med)
        maxi = max(maxi, search_interval(searchl, searchr, med + 1, r, 2 * node + 1));
    return maxi;
}
int main()
{
    int m;
    in>>n>>m;
    for(int i = 1; i <= n; i++)
        in>>v[i];
    int nrlevel = log2(n);
    nrlevel += ((1<<nrlevel) < n);
    lastnode = (1<<nrlevel);

    build_tree();

    for(int i = 1; i <= m; i++)
    {
        int q,a,b;
        in>>q>>a>>b;
        if(q == 0)
            out<<search_interval(a,b)<<'\n';
        if(q == 1)
            update(a,b);
    }
    return 0;
}