Cod sursa(job #2447019)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 11 august 2019 16:01:06
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

int tree[400004], N, m, x, op, a, b;

std::ifstream fin("aib.in");
std::ofstream fout("aib.out");

void update(int value, int position, int left = 1, int right = N, int node = 1)
{
    if(left == right)
    {
        tree[node] = value;
        return;
    }

    int mid = (left + right) >> 1;

    position <= mid ?  update(value, position, left, mid, node << 1) : update(value, position, mid + 1, right, (node << 1) + 1);

    tree[node] = (tree[node << 1] > tree[(node << 1) + 1]) ? tree[node << 1] : tree[(node << 1) + 1];
}

int query(int a, int b, int left = 1, int right = N, int node = 1)
{
    if(a <= left && right <= b)
    {
        return tree[node];
    }

    int mid = (left + right) >> 1;

    int MAX = 0;

    if(a <= mid)
    {
        MAX = query(a, b, left, mid, node << 1);

    }

    if(b > mid)
    {
        int subresult = query(a, b, mid + 1, right, (node << 1) + 1);

        MAX = MAX > subresult ? MAX : subresult;
    }

    return MAX;
}

int main()
{

    fin >> N >> m;

    for(int i = 1; i <= N; i++)
    {
        fin >> x;
        update(x, i);
    }

    for(; m; m--)
    {
        fin >> op >> a >> b;

        if(op == 0)
        {
            fout << query(a, b) << "\n";
        }
        else
        {
            update(b, a);
        }
    }

}