Cod sursa(job #2936063)

Utilizator Vlad_NistorNIstor Vlad Vlad_Nistor Data 7 noiembrie 2022 23:06:27
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;

int arbint[400005], a[100005];

void build(int nod, int st, int dr){
    if(st == dr){
        arbint[nod] = a[st];
    }else{
        int mid = (st + dr) / 2;
        build(nod * 2, st, mid);
        build(nod*2+1, mid+1, dr);
        arbint[nod] = max(arbint[nod * 2], arbint[nod * 2 +1]);
    }
}

int maxim = -1;

void query(int nod, int st, int dr, int l, int r){
    if(l <= st && r >= dr){
        maxim = max(maxim, arbint[nod]);
    }else{
        int mid = (st + dr) / 2;
        if(l <= mid){
            query(2 * nod,st,mid, l, r);
        }else{
            query(2 * nod + 1,mid+1,dr,l,r);
        }
    }
}

void update(int nod, int st, int dr, int poz, int x){
    if(st == dr){
        arbint[nod] = x;
    }else{
        int mid = (st + dr) / 2;
        if(poz <= mid){
            update(nod * 2, st, mid, poz, x);
        }else{
            update(nod * 2 + 1, mid+1,dr, poz ,x);
        }
        arbint[nod] = max(arbint[nod * 2 + 1], arbint[nod * 2]);
    }
}

int main(void){
    ofstream cout("arbint.out");
    ifstream cin("arbint.in");
    int n,Q;
    cin >> n >> Q;
    for(int i = 1;i<=n;i++){
        cin >> a[i];
    }
    build(1,1,n);
    while(Q--){
        int p, l, r;
        cin >> p >> l >> r;
        if(p == 0){
            maxim = 0;
            query(1,1,n,l,r);
            a[l] = r;
            cout << maxim << '\n';
        }else{
            update(1,1,n,l,r);
        }
    }
}