Cod sursa(job #1741105)

Utilizator Bulgaru_Robert_Razvan_323CBBulgaru Robert Razvan Bulgaru_Robert_Razvan_323CB Data 12 august 2016 23:16:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <fstream>
 
using namespace std;
 
ifstream in("arbint.in");
ofstream out("arbint.out");
 
int tree[4*100000+5];
int n, m,val,maxi,op, a, b;
 
void add(int node, int left, int right, int pos, int val) {
    if (left == right){
        tree[node] = val;
        return;
    }

    int mid = (left+right)/2;
    if(pos <= mid){
        add(2*node, left, mid, pos, val);
    }else{
        add(2*node+1, mid+1, right, pos, val);
    }

    tree[node] = max(tree[2*node], tree[2*node+1]);
}
 
 
void query(int node, int left, int right, int a, int b)
{
    if(a <= left and right <= b){
        maxi = max(tree[node], maxi);
        return;
    }
    
    int mid = (left+right)/2;
    if(a <= mid){
        query(2*node, left, mid, a, b);
    }
    if(b > mid){
        query(2*node+1, mid+1, right, a, b);
    }
}
 
int main()
{
    in >> n >> m;
 
    for(int i=1; i<=n; i++){
        in >> val;
        add(1, 1, n, i, val);
    }
 
    for(int i=0; i<m; i++){
        in >> op >> a >> b;

        if(op == 0){
            maxi = -1;
            query(1, 1, n, a, b);
            out << maxi << '\n';
        }

        if(op == 1){
            add(1, 1, n, a, b);
        }
    }
 
    return 0;
}