Cod sursa(job #3167052)

Utilizator poparobertpoparobert poparobert Data 9 noiembrie 2023 22:08:39
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
class AINT
{
    ll n;
    vector<ll> v;
    void build(vector<ll>&a,ll st,ll dr,ll p)
    {
        if(st==dr)return v[p]=a[st],void();
        ll mid=(st+dr)/2;
        build(a,st,mid,p+1);
        build(a,mid+1,dr,p+2*(mid-st+1));
        v[p]=max(v[p+1],v[p+2*(mid-st+1)]);
    }
    void set(ll st,ll dr,ll p,ll pz,ll val)
    {
        if(st==dr)return v[p]=val,void();
        ll mid=(st+dr)/2;
        if(pz<=mid)set(st,mid,p+1,pz,val);
        else set(mid+1,dr,p+2*(mid-st+1),pz,val);
        v[p]=max(v[p+1],v[p+2*(mid-st+1)]);
    }
    ll ask(ll st,ll dr,ll p,ll l,ll r)
    {
        if(l<=st&&r>=dr)return v[p];
        ll mid=(st+dr)/2;
        if(r<=mid)return ask(st,mid,p+1,l,r);
        if(l>mid)return ask(mid+1,dr,p+2*(mid-st+1),l,r);
        return max(ask(st,mid,p+1,l,r),ask(mid+1,dr,p+2*(mid-st+1),l,r));
    }
public:
    AINT(ll x=0){n=x;v.resize(2*n);}
    void build(vector<ll>&a)
    {
        build(a,1ll,n,0ll);
    }
    void set(ll pz,ll val)
    {
        set(1ll,n,0ll,pz,val);
    }
    ll ask(ll l,ll r)
    {
        return ask(1ll,n,0ll,l,r);
    }
};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    ll n,m,a,x,y,i;
    cin>>n>>m;
    vector<ll>v(n+1);
    for(i=1;i<=n;i++)cin>>v[i];
    AINT alex(n);
    alex.build(v);
    while(m--)
    {
        //cerr<<m<<endl;
        cin>>a>>x>>y;
        if(a==0)
        {
            cout<<alex.ask(x,y)<<'\n';
        }
        else
        {
            alex.set(x,y);
        }
    }
	return 0;
}