Cod sursa(job #3167634)

Utilizator poparobertpoparobert poparobert Data 10 noiembrie 2023 22:29:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 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;
    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)
    {
        ll i;
        for(i=1;i<=n;i++)v[n+i-1]=a[i];
        for(i=n-1;i>0;i--)v[i]=max(v[2*i],v[2*i+1]);
    }
    void set(ll pz,ll val)
    {
        v[(pz+=n-1)]=val;
        for(pz>>=1;pz>0;pz>>=1)v[pz]=max(v[2*pz],v[2*pz+1]);
    }
    ll ask(ll l,ll r)
    {
        ll rez=0;
        for(l+=n-1,r+=n;l<r;l>>=1,r>>=1)
        {
            if(l&1)rez=max(rez,v[l++]);
            if(r&1)rez=max(rez,v[--r]);
        }
        return rez;
    }
};
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;
}