Cod sursa(job #3247968)

Utilizator FlaviuuuFlaviu Flaviuuu Data 10 octombrie 2024 10:01:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define ll long long
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)
    {
        if(st == dr)
        {
            v[p] = val;
            return;
        }
        ll mid = (st + dr) >> 1;
        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(st >= l && dr <= r)
            return v[p];
        if(st > r || dr < l)
            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(n * 4 + 4);
    }
    void build(vector<ll>& a){build(1, n, 1, a);}
    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;
    fin>>n>>m;
    vector<ll> a(n + 5);
    for(int i = 1; i <= n; i++)
        fin>>a[i];
    AINT Alex(n);
    Alex.build(a);
    for(int i = 1; i <= m; i++)
    {
        char ch;
        ll x, y;
        fin>>ch>>x>>y;
        if(ch == '1')
            Alex.set(x, y);
        else
            fout<<Alex.query(x, y)<<'\n';
    }
    return 0;
}