Cod sursa(job #3121004)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 10 aprilie 2023 10:45:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.34 kb
/*
    Arbori de intervale
*/

#include <bits/stdc++.h>

using namespace std;

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

const int dim = (1 << 20);
const int dim1 = 1e5 + 5;
int v[dim1] , seg_tree[dim] , n , m;

void build (int node , int left , int right)
{
    if(left == right)
        seg_tree[node] = v[left];
    else
        {
            int middle = (left + right) / 2;

            build(2 * node , left , middle);
            build(2 * node + 1 , middle + 1 , right);

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

void update (int node , int left , int right , int position , int new_value)
{
    if(left == right)
        seg_tree[node] = new_value;
    else
        {
            int middle = (left + right) / 2;

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

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

int query (int node , int left , int right , int queryLeft , int queryRight)
{
    if(left >= queryLeft && right <= queryRight)
        return seg_tree[node];
    else
        {
            int middle = (left + right) / 2;
            if(queryRight <= middle)
                return query(2 * node , left , middle , queryLeft , queryRight);
            if(queryLeft >= middle + 1)
                return query(2 * node + 1 , middle + 1 , right , queryLeft , queryRight);
            return max(query(2 * node , left , middle , queryLeft , queryRight) , query(2 * node + 1 , middle + 1 , right , queryLeft , queryRight));
        }
}

int main()
{
    fin >> n >> m;
    for(int i = 1 ; i <= n ; ++i)
        fin >> v[i];
    build(1 , 1 , n);
    while(m--)
        {
            bool operation;
            int left , right , position , value;
            fin >> operation;
            if(operation == 0)
                {
                    fin >> left >> right;
                    fout << query(1 , 1 , n , left , right) << '\n';
                }
            else
                {
                    fin >> position >> value;
                    update(1 , 1 , n , position , value);
                }
        }
}