Cod sursa(job #2434975)

Utilizator rd211Dinucu David rd211 Data 2 iulie 2019 17:33:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int arb[2*100010];
void update(int index,int value)
{
    index+=n;
    arb[index]=value;
    while(index)
    {
        index/=2;
        arb[index]=max(arb[2*index],arb[2*index+1]);
    }
}
int query(int left,int right)
{
    int maximum = -100000;
    left+=n;
    right+=n;
    while(left<right)
    {
        if(left%2)
        {
            maximum=max(maximum,arb[left]);
            left++;
        }
        if(right%2)
        {
            right--;
            maximum=max(maximum,arb[right]);
        }
        left/=2,right/=2;
    }
    return maximum;
}
void construct()
{
    for(int i = n-1;i>0;i--)
        arb[i]=max(arb[2*i],arb[2*i+1]);
}
int main()
{
    int q,a,b;
    fin>>n>>m;
    for(int i = 0;i<n;i++)
        fin>>arb[i+n];
    construct();
    while(m--)
    {
        fin>>q>>a>>b;
        if(q)
        {
           update(a-1,b);
        }
        else
        {
            fout<<query(a-1,b)<<'\n';
        }
    }
    //for(int i = 1;i<=2*n;i++)
    //    cout<<arb[i]<<" ";
    return 0;
}