Cod sursa(job #3364145)

Utilizator gaminggodBarbulescu Luca Traian gaminggod Data 30 august 2026 18:30:34
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;

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

#define cin fin
#define cout fout

const int Nmax=1e5+5;
int v[Nmax],tree[4*Nmax];

struct AINT
{
    void build(int node, int l, int r)
    {
        if(l==r)
        {
            tree[node]=v[l];
        }
        else
        {
            int m=(l+r)/2;
            build(node*2,l,m);
            build(node*2+1,m+1,r);
            tree[node]=max(tree[2*node],tree[2*node+1]);
        }
    }
    int query(int node, int tl, int tr, int l, int r)
    {   
        if(l>r) return 0;
        if(tl==l && tr==r) return tree[node];
        int tm=(tl+tr)/2;
        return max(query(node*2,tl,tm,l,min(tm,r)),query(node*2+1,tm+1,tr,max(l,tm+1),r));
    }
    void update(int node,int tl,int tr,int poz, int val)
    {
        if(tl==tr)
        {
            tree[node]=val;
            return;
        }
        else
        {
            int tm=(tl+tr)/2;
            if(poz<=tm)
            {
                update(node*2,tl,tm,poz,val);
            }
            else
            {
                update(node*2+1,tm+1,tr,poz,val);
            }
        }
        tree[node]=max(tree[node*2],tree[node*2+1]);
    }
} aint;
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i];
    aint.build(1,1,n);
    while(m--)
    {
        int tip;
        cin>>tip;
        if(tip==0)
        {   
            int l,r;
            cin>>l>>r;
            cout<<aint.query(1,1,n,l,r)<<"\n";
        }
        else
        {
            int idx,val;
            cin>>idx>>val;
            aint.update(1,1,n,idx,val);
        }
    }
    return 0;
}