Cod sursa(job #2902785)

Utilizator andriciucandreeaAndriciuc Andreea andriciucandreea Data 16 mai 2022 20:19:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

vector <int> values(100001);
vector <int> nodes(400100);

void construct(int pos, int left, int right)
{
    if(left ==  right)
    {
        nodes[pos] = values[left];
        return;
    }
    construct(pos*2, left, (left + right)/2);
    construct(pos*2+1, (left + right)/2+1, right);
    nodes[pos] = max(nodes[pos*2], nodes[2*pos+1]);
}

int max_value(int pos, int left, int right, int start, int finish)
{
    if(finish < left || right < start) return 0;
    if(start <= left && right <= finish)
        return nodes[pos];
    int first_half = max_value(pos*2, left, (left+right)/2, start, finish);
    int second_half = max_value(pos*2+1, (left+right)/2+1, right, start, finish);
    return max(first_half, second_half);
}

void update(int curr, int left, int right, int val, int pos)
{
    if(left ==  right)
    {
        nodes[curr] = val;
        return;
    }
    if((left+right)/2 >=  pos)
        update(curr*2, left, (left+right)/2, val, pos);
    else
        update(curr*2+1, (left+right)/2+1, right, val, pos);
    nodes[curr] = max(nodes[2*curr], nodes[2*curr+1]);
}

int main()
{
    int n, m;
    fin>>n>>m;

    for(int  i = 1; i <= n; i++)
        fin>>values[i];
    construct(1, 1, n);

    for(int i = 0; i < m; i++)
    {
        int op, a, b;
        fin>>op>>a>>b;
        if(op == 0)         ///0 a b - Sa se determine maximul din intervalul [a,b] (maximul dintre valorile Ai cu a ≤ i ≤ b).
            fout<<max_value(1, 1, n, a, b)<<'\n';
        else if(op == 1)    ///1 a b - Valoarea elementului de pe pozitia a va deveni b
            update(1,1, n, b, a);
    }
    return 0;
}