Cod sursa(job #2446716)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 10 august 2019 15:50:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <iostream>
int tree[400004], position, value, a, b, n, m, op, last;

void update(int node, int left, int right){
    if(left == right){
        tree[node] = value;
        return;
    }

    int mid = ((left + right)>>1);

    if(position <= mid) update(2 * node, left, mid);
    else update(2 * node + 1, mid + 1, right);

    tree[node] = std::max(tree[2 * node], tree[2 * node + 1]);
}

int query(int node, int left, int right){
    if(a <= left && right <= b)
        return tree[node];

    int mid = ((left + right)>>1);

    int answer = 0;

    if(a <= mid) answer = std::max(answer, query(2 * node, left, mid));
    if(b > mid) answer = std::max(answer, query(2 * node + 1, mid + 1, right));

    return answer;
}

int main()
{
    std::ifstream fin("arbint.in");
    std::ofstream fout("arbint.out");

    fin>>n>>m;

    last = n;
    while(last & (last - 1)) last++;

    for(position=1; position <= n; position++) {
        fin>>value;
        update(1, 1, last);
    }


    for(; m>0; m--){
        fin>>op;

        if(op){
            fin>>position>>value;
            update(1, 1, last);
        }
        else {
            fin>>a>>b;
            fout<<query(1, 1, last)<<"\n";
        }
    }
}