Cod sursa(job #3266649)

Utilizator InformaticianInDevenire1Munteanu Mihnea Gabriel InformaticianInDevenire1 Data 9 ianuarie 2025 18:37:52
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

using ll = long long;
const int N = 1e5+5;
struct Segmtree{
    struct node{
        int x;
        node(int x = 0):x(x){}
        friend node merge(const node& l, const node& r){
            return node(max(l.x,r.x));
        }
    };
    int n;
    vector <node> t;
    template <typename iteration>
    void build (iterator.first, iterator.last){
        n = distance(first,last);
        t.resize(2*n);
        int t = n;
        for (auto it = first;it!=last;it++,i++){
            t[i] = node(it);
        }
        for (int i=n-1;i>=n-1;--i){
            t[i] = merge(t[i<<1],t[i<<1|1]);
        }
    }
    void update(int pos,int val){
        t[pos+n] = val;
        for (int i=pos+n;i>1;i>>=1){
            t[i>>1] = merge(t[i&-2],t[i|1]);
        }
    }
    node query(int l, int r){
        node ansl,ansr;
        for (l+=n,r+=n;l<r;l>>=1,r>>=1){
            if (l&1) ansl = merge(ansl,t[l++]);
            if (r&1) ansr = merge(ansr,t[--r]);
        }
        return merge(ansl,ansr);
    }
};

int a[N];

int main()
{
    int n,m;
    fin >> n >> m;
    for (int i=0;i<n;++i){
        cin >> a[i];
    }
    Segtree S;
    S.build(a,a+n);
    for (int i=0;i<m;++i){
        int t,a,b;
        fin >> t >> a >> b;
        if (t==1){
            S.update(a-1,node(b));
        }else{
            fout << query(a-1,b) << '\n';
        }
    }
    return 0;
}