Cod sursa(job #2818289)

Utilizator AndreiP25Prusacov Andrei AndreiP25 Data 15 decembrie 2021 20:05:36
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;

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

int tree[400001], v[100000];

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

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

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

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

int query(int node, int left, int right, int q_left, int q_right)
{
    if(q_left <= left && right <= q_right)
        return tree[node];
    else
    {
        int middle=(left+right)/2;
        if(q_right<=middle)
            return query(node*2, left, middle, q_left, q_right);
        if(q_left>= middle+1)
            return query(node*2+1, middle+1, right, q_left, q_right);

        return max(query(node*2, left, middle, q_left, q_right), query(node*2+1, middle+1, right, q_left, q_right));
    }
}

int main()
{
    int a,b,o,N,M;
    fin>>N>>M;
    for(int i=1; i<=N; i++)
        fin>>v[i];
    build(1,1,N);
    for(int i=1; i<=M; i++)
    {
        fin>>o>>a>>b;
        if(o)
            update(1,1,N,a,b);
        else
            fout<<query(1,1,N,a,b)<'/n';
    }

    return 0;
}