Cod sursa(job #2578208)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 10 martie 2020 19:04:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 1e5 + 1;

int segment_tree[4*N_MAX], N, M;

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

    int middle = (left + right) / 2;

    if(index <= middle)
        update(value, index, left, middle, node * 2);
    else
        update(value, index, middle + 1, right, node * 2 + 1);

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

}


int query(int first, int last, int left = 1, int right = N, int node = 1)
{
    if(first <= left && last >= right)
        return segment_tree[node];

    int middle = (left + right) / 2;

    int answer = 0;

    if(first <= middle)
        answer = max(answer, query(first, last, left, middle, node * 2));

    if(last > middle)
        answer = max(answer, query(first, last, middle + 1, right, node * 2 + 1));

    return answer;
}


int main()
{
    fin >> N >> M;

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

    for(int c, a ,b, i = 1; i <= M; ++i)
    {
        fin >> c >> a >> b;

        if(c == 0)
            fout << query(a, b) << '\n';
        else
            update(b, a);
    }
}