Cod sursa(job #3365120)

Utilizator RZV139fjDragomir Ioan Razvan RZV139fj Data 17 septembrie 2026 09:53:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAX_N=100000;

int nxt_power2(int val)
{
    return 1<<(32-__builtin_clz(val));
}

struct arb_int{
    int v[4*MAX_N];
    int n;

    void init(int len)
    {
        n=nxt_power2(len);
        for(int i=n; i<n+len; i++)
        {
            fin>>v[i];
        }
    }

    void build()
    {
        for(int i=n-1; i>0; i--)
        {
            v[i]=max(v[2*i+1],v[2*i]);
        }
    }

    void update(int pos, int val)
    {
        v[n+pos]=val;
        pos+=n;
        for(pos/=2; pos>0; pos/=2)
        {
            v[pos]=max(v[2*pos],v[2*pos+1]);
        }
    }

    void query(int l, int r)
    {
        l=l+n;
        r=r+n;
        int maxim=0;
        while(l<=r)
        {
            if(l%2==1)
            {
                maxim=max(v[l++],maxim);
            }
            l=l>>1;

            if(r%2==0)
            {
                maxim=max(v[r--],maxim);
            }
            r=r>>1;
        }

        fout<<maxim<<'\n';

    }
};
arb_int arbore;
int main()
{

    int lung,q;
    fin>>lung>>q;
    arbore.init(lung);
    arbore.build();
    for(int i=1;i<=q;i++)
    {
        int tip;
        fin>>tip;
        if(tip==1)
        {
            int poz,val;
            fin>>poz>>val;
            arbore.update(poz-1,val);
        }
        else
        {
            int left,right;
            fin>>left>>right;
            arbore.query(left-1,right-1);
        }
    }





    return 0;
}