Cod sursa(job #3219988)

Utilizator Vlad_NistorNIstor Vlad Vlad_Nistor Data 1 aprilie 2024 22:29:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
using namespace std;
#define NMAX 100000


int a[NMAX], aint[NMAX * 5];

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

    }
}

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

        aint[nod] = max(aint[nod * 2], aint[2 * nod +1]);
    }
}

int maxim = -1;

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

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 q, x, y;
        cin >> q >> x >> y;
        if(q == 1){
            update(1,1,n,x,y);
        }else{
            maxim = -1e9;
            query(1,1,n,x,y);
            cout << maxim << '\n';
        }
    }

}