Cod sursa(job #2905510)

Utilizator Frant_IoanaFrant Ioana Frant_Ioana Data 22 mai 2022 10:55:06
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m, v[100001];

int getMid(int s, int e){
    return (s + e) / 2;
}

/*int updateValueUtil(int *st, int ss, int se, int i, int new_val, int si){
    if(i < ss || i > se)
        return 0;

    if(ss != se){
        int mid = getMid(se, ss);
        st[si] = max(updateValueUtil(st, ss, mid, i, new_val, 2 * si + 1), updateValueUtil(st, mid + 1, se, i, new_val, 2 * si + 2));
    }

    return st[si];
}*/

/*void updateValue(int v[], int *st, int n, int i, int new_val){
    v[i] = new_val;
    updateValueUtil(st, 0, n - 1, i, new_val, 0);
}*/

int getMaxUtil(int *st, int ss, int se, int qs, int qe, int si){
    if(qs <= ss && qe >= se)
        return st[si];
    
    if(se < qs || ss > qe)
        return 0;
    
    int mid = getMid(ss, se);

    return max(getMaxUtil(st, ss, mid, qs, qe, 2 * si + 1), getMaxUtil(st, mid + 1, se, qs, qe, 2 * si + 2));
}

int getMax(int *st, int n, int qs, int qe){
    return getMaxUtil(st, 0, n - 1, qs, qe, 0);
}

int constructSTUtil(int v[], int ss, int se, int *st, int si){
    if(ss == se){
        st[si] = v[ss];
        return v[ss];
    }

    int mid = getMid(ss, se);
    st[si] = max(constructSTUtil(v, ss, mid, st, si * 2 + 1), constructSTUtil(v, mid + 1, se, st, si * 2 + 2));
    return st[si];
}

void updateValue(int v[], int *st, int n, int i, int new_val){
    v[i] = new_val;
    constructSTUtil(v, 0, n - 1, st, 0);
}

int *constructST(int v[], int n){
    int x = (int) (ceil(log2(n)));
    int max_size = 2 * (int) pow(2, x) - 1;

    int *st = new int[max_size];
    constructSTUtil(v, 0, n - 1, st, 0);

    return st;
}

int main(){
    int n, m, v[100001], c, a, b;

    fin >> n >> m;
    for(int i = 0; i < n; i++)
        fin >> v[i];

    int *st = constructST(v, n);

    for(int i = 1; i <= m; i++){
        fin >> c >> a >> b;
        
        if(c == 0)
            fout << getMax(st, n, a - 1, b - 1) << '\n';
        else
            updateValue(v, st, n, a - 1, b);
    }
}