Cod sursa(job #3247122)

Utilizator FlaviuuuFlaviu Flaviuuu Data 5 octombrie 2024 18:16:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#define ll long long
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
class AINT{
    vector<ll> v;
    ll n;
    void build(ll st, ll dr, ll p, vector<ll>& a)
    {
        if(st == dr)
        {
            v[p] = a[st];
            return;
        }
        ll mid = (st + dr)>>1;
        build(st, mid, p<<1, a);
        build(mid + 1, dr, p<<1|1, a);
        v[p] = max(v[p<<1], v[p<<1|1]);
    }
    void set(ll st, ll dr, ll p, ll poz, ll val)
    {
        ll mid = (st + dr)>>1;
        if(st == dr)
        {
            v[p] = val;
            return;
        }
        if(poz <= mid)
            set(st, mid, p<<1, poz, val);
        else
            set(mid + 1, dr, p<<1|1, poz, val);
        v[p]=max(v[p<<1], v[p<<1|1]);
    }
    ll query(ll st, ll dr, ll p, ll l, ll r)
    {
        if(l <= st && r >= dr)
            return v[p];
        if(dr < l || st > r)
            return 0ll;
        ll mid = (st + dr) >> 1;
        return max(query(st, mid, p<<1, l, r), query(mid + 1, dr, p<<1|1, l, r));
    }
    public:
    AINT(ll x)
    {
        n = x;
        v.resize(4 * n + 4);
    }
    void build(vector<ll> &v){build(1, n, 1, v);}
    void set(ll poz, ll val){set(1, n, 1, poz, val);}
    ll query(ll l, ll r){return query(1, n, 1, l, r);}
};
int main()
{
    ll n, m;
    int i;
    cin>>n>>m;
    vector<ll> v(n + 5);
    for(i = 1; i <= n; i++)
        cin>>v[i];
    AINT Alex(n);
    Alex.build(v);
    ll a, b;
    for(i = 1; i <= m; i++)
    {
        char ch;
        cin>>ch;
        cin>>a>>b;
        if(ch == '0')
            cout<<Alex.query(a, b)<<'\n';
        else
            Alex.set(a, b);
    }
    return 0;
}