Cod sursa(job #2769502)

Utilizator RamanujanNeacsu Mihnea Ramanujan Data 16 august 2021 11:06:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>

using namespace std;

ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
const int maxn=100000;
int start, queryType, x, y, n, m;
int a[4*maxn];

void update(int newValue, int nod){
    a[nod]=newValue;//punem valoarea initiala
    while(nod!=1){//cata vreme mai pot urca
        nod/=2;//urcam un nod
        a[nod]=max(a[2*nod], a[2*nod+1]);//actualizez cu maximul dinre fii
    }
}
int query(int lo, int hi){
    if(lo>hi)
        return 0;
    int leftValue=0, rightValue=0;
    if(lo==hi)
        return a[lo];
    if(lo%2==1){
        leftValue=a[lo];
        lo++;
    }
    if(hi%2==0){
        rightValue=a[hi];
        hi--;//daca am include noduri noi, n-ar merge nimic, aa ca ne deplasam st-dr
    }
    lo/=2, hi/=2;//mergem un nivel mai sus
    return max(max(leftValue, rightValue), query(lo, hi));
}

int main()  {
    cin >> n >> m;
    start = 1;
    while (start < n)
        start <<= 1;
    for(int i=start; i<start+n; i++){
        cin>>a[i];
        update(a[i], i);//actualizam arborele
    }
    for(int i=0; i<m; i++){
        cin>>queryType>>x>>y;
        if(queryType==0){//daca
            cout<<query(x+start-1, y+start-1) << '\n';
        }
        else{
            update(y, x+start-1);
        }
    }
    return 0;
}