Cod sursa(job #2512984)

Utilizator GBearUrsu Ianis-Vlad GBear Data 22 decembrie 2019 09:53:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
#define N_MAX 100000 + 1
using namespace std;

vector<int> segmentTree(4 * N_MAX);
int N;

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

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

    if(position <= middle)
    {
        update(position, value, left, middle, node << 1);
    }
    else
    {
        update(position, value, middle + 1, right, (node << 1) + 1);
    }

    segmentTree[node] = max(segmentTree[node << 1], segmentTree[(node << 1) + 1]);

    return;
}


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

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

    int max_left = -1, max_right = -1;

    if(a <= middle)
    {
        max_left = rangeQuery(a, b, left, middle, node << 1);
    }

    if(b > middle)
    {
        max_right = rangeQuery(a, b, middle + 1, right, (node << 1) + 1);
    }

    return max(max_left, max_right);
}


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

    int M;

    fin >> N >> M;

    for(int i = 1; i <= N; ++i)
    {
        int x;

        fin >> x;

        update(i, x);
    }

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

        fin >> c >> a >> b;

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