Cod sursa(job #2304540)

Utilizator lulian23Tiganescu Iulian lulian23 Data 18 decembrie 2018 10:23:12
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

int n, m, maxx;
int tree[ 200010 ];

void update(int nod, int left, int right, int pos, int val){
    if (left == right){
        tree[ nod ] = val;
        return ;
    }

    int mid = (left + right) / 2;

    if (pos <= mid)
        update(nod << 1, left, mid, pos, val);
    else
        update(nod << 1 | 1, mid + 1, right, pos, val);

    tree[ nod ] = max(tree[ nod << 1], tree[ nod << 1 | 1 ]);
}

void query(int nod, int left, int right, int l, int r){
    if (l <= left && right <= r){
        if (maxx < tree[ nod ]) maxx = tree[ nod ];
        return ;
    }

    int mid = (right + left) / 2;

    if (l <= mid)
        query(nod << 1, left, mid, l, r);
    if (mid < r)
        query(nod << 1 | 1, mid + 1, right, l, r);
}




int main(){
    ios_base::sync_with_stdio(false);

    ifstream cin("arbint.in");
    ofstream cout("arbint.out");

    cin >> n >> m;

    for (int i = 1, x; i <= n; ++i){
        cin >> x;
        update(1, 1, n, i, x);
    }

    for (int i = 1, q, a, b; i <= m; ++i){
        cin >> q >> a >> b;

        if (q == 0){
            maxx = -1;

            query(1, 1, n, a, b);
            cout << maxx << '\n';
        }

        else
            update(1, 1, n, a, b);
    }
}