Cod sursa(job #2969379)

Utilizator sandry24Grosu Alexandru sandry24 Data 22 ianuarie 2023 21:53:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;
#define pb push_back
#define mp make_pair
#define f first
#define s second

vector<pi> st(4*100001);

pi combine(pi a, pi b){
    if(a.f > b.f)
        return a;
    else if(b.f > a.f)
        return b;
    return(mp(a.f, a.s + b.s));
}

void build(vi &a, int v, int tl, int tr) {
    if (tl == tr) {
        st[v] = mp(a[tl], 1);
    } else {
        int tm = (tl + tr) / 2;
        build(a, v*2, tl, tm);
        build(a, v*2+1, tm+1, tr);
        st[v] = combine(st[v*2], st[v*2+1]);
    }
}

pi max_query(int v, int tl, int tr, int l, int r) {
    if (l > r) 
        return mp(-1e9, 0);
    if (l == tl && r == tr)
        return st[v];
    int tm = (tl + tr) / 2;
    return combine(max_query(v*2, tl, tm, l, min(r, tm)),
                    max_query(v*2+1, tm+1, tr, max(l, tm+1), r));
}

void update(int v, int tl, int tr, int pos, int new_val){
    if(tl == tr){
        st[v] = mp(new_val, 1);
    } else {
        int tm = (tl + tr) / 2;
        if(pos <= tm)
            update(v*2, tl, tm, pos, new_val);
        else
            update(v*2+1, tm+1, tr, pos, new_val);
        st[v] = combine(st[v*2], st[v*2+1]);
    }
}
 
void solve(){
    int n, m;
    cin >> n >> m;
    vi a(n);
    for(int i = 0; i < n; i++)
        cin >> a[i];
    build(a, 1, 0, n-1);
    for(int i = 0; i < m; i++){
        int c, a, b;
        cin >> c >> a >> b;
        if(c == 0)
            cout << max_query(1, 0, n-1, a-1, b-1).f << '\n';
        else
            update(1, 0, n-1, a-1, b);
    }
}   
 
int main(){
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
}