Cod sursa(job #2834249)

Utilizator BuzatuCalinBuzatu Calin BuzatuCalin Data 16 ianuarie 2022 18:21:10
Problema Arbori de intervale Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.66 kb
//problema arbint 
#include <iostream>
#include <fstream>
using namespace std;
const int DIM=500001;
long long int segment_tree[DIM],arr[DIM],n,q,a,b,maxim=-1;
void update(int node,int left,int right,int position,int num)
{
    if(left==right)
    {
        segment_tree[node]=num;
        return;
    }
    else
    {
        int middle=(left+right)/2;
        if(position<=middle)
        {
            update(2*node,left,middle,position,num);
        }
        else
        {
            update(2*node+1,middle+1,right,position,num);
        }
        segment_tree[node]=max(segment_tree[2*node],segment_tree[2*node+1]);
    }
}
void query(int node,int left,int right,int q_left,int q_right)
{
    if(q_left<=left && right<=q_right)
    {
        if(maxim<segment_tree[node])
        {
            maxim=segment_tree[node];
        }
        return;
    }
    else
    {
        int middle=(right+left)/2;
        if(q_left<=middle)
        {
            query(2*node,left,middle,q_left,q_right);
        }
        else if(middle<q_right)
        {
            query(2*node+1,middle+1,right,q_left,q_right);
        }
    }
}
void citire()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        fin>>arr[i];
        update(1,1,n,i,arr[i]);
    }
    int comm;
    for(int i=1;i<=q;i++)
    {
        fin>>comm>>a>>b;
        if(comm==0)
        {
            update(1,1,n,a,b);
        }
        else if(comm==1)
        {
            maxim=-1;
            query(1,1,n,a,b);
            fout<<maxim<<'\n';
        }
    }
}
int main()
{
    citire();
}