Cod sursa(job #666946)

Utilizator EstarDaian Dragos Estar Data 22 ianuarie 2012 14:40:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream fi("arbint.in");
ofstream fo("arbint.out");

int sir[400001] , lef , righ , node , val, maxim;

void update(int nod , int l , int r){
    if(l==r){sir[nod]=val;return;}
    int half=(l+r)/2;
    if(node<=half)update(2*nod,l,half);
    if(node>half)update(2*nod+1,half+1,r);
    sir[nod]=max(sir[2*nod+1],sir[2*nod]);
}

void maxinterval(int nod , int l , int r){
    if(l>=lef&&r<=righ){
    if(sir[nod]>maxim)maxim=sir[nod];
    return;
    }
    int half=(l+r)/2;
    if(half>=lef)maxinterval(2*nod,l,half);
    if(half+1<=righ)maxinterval(2*nod+1,half+1,r);
}

int main(){
    int n,m;
    fi>>n>>m;
    for(int i=0;i<n;i++){
        fi>>val;
        node=i+1;
        update(1,1,n);
    }
    for(int i=0;i<m;i++){
        int q,a,b;
        fi>>q>>a>>b;
        switch(q){
        case 0:
        maxim=-1;
        lef=a;
        righ=b;
        maxinterval(1,1,n);
        fo<<maxim<<'\n';
        break;
        case 1:
        val=b;
        node=a;
        update(1,1,n);
        }
    }
    return 0;
}