Cod sursa(job #956342)

Utilizator cousin.batmanVaru Batman cousin.batman Data 2 iunie 2013 21:36:15
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#define MAX 200000

int d[2*MAX];
using namespace std;

int get(int node, int l, int r, int a, int b){
    int m = 0, result;

    if(l>=a && r<=b)
        return d[node];
    else{
        m = (l+r)/2;

        result = -1;
        if(m>=a) 
            result = get(2*node, l, m, a, b);
        if(m+1<=b) {
            m = get(2*node+1, m+1, r, a, b);
            result = result>m? result: m;
        }
        return result;
    }
}
void put(int node, int l, int r, int a, int b){
    int m = 0;
    if(l==a && r==a)
        d[node] = b;
    else {
        m = (l+r)/2;
        if(m>=a)
            put(2*node, l, m, a, b);
        else
            put(2*node+1, m+1, r, a ,b);

        d[node] = d[2*node]>d[2*node+1]? d[2*node]: d[2*node+1];
    }
}

int main(){
    int n, m, op, a, b, i;
    ifstream in("arbint.in");
    ofstream out("arbint.out");

    in>>n>>m;

    for(i=1; i<=n; i++){
        in>>a;
        put(1, 1, n, i, a);
    }

    for(i=0; i<m; i++){
        in>>op>>a>>b;
    
        if(op==0)
            out<<get(1, 1, n, a, b)<<endl;
        else
            put(1, 1, n, a, b);
    }

    in.close();
    out.close();
    return 0;
}