Cod sursa(job #1611737)

Utilizator arvlgeArdeleanu Vlad George arvlge Data 24 februarie 2016 13:16:20
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>
#include<iostream>

//#define dim 100001;
using namespace std;


int a,b,c,x,m,n,f,h;

int ar [4 * 100001 + 66 ];

void update (int nod,int ext_s,int ext_d,int val,int pos_val){
    if(ext_s == ext_d){
        ar[nod]=val;
        return;
    }

    int div=(ext_s+ext_d)/2;

    if(pos_val <= div)
        update(2*nod,ext_s,div,val,pos_val);
    else
        update(2*nod+1,div+1,ext_d,val,pos_val);

    ar[nod]=max(ar[2*nod],ar[2*nod+1]);
}

void question (int nod,int ext_s,int ext_d,int pos_i,int pos_f){
    if(pos_i <= ext_s && ext_d <= pos_f)
        if( h <= ar[nod]){
            h=ar[nod];
            return;
        }
        int div = (ext_s+ext_d)/2;

        if(pos_i <= div)
            question(2*nod,ext_s,div,pos_i,pos_f);
        if(div < pos_f)
            question(2*nod+1,div+1,ext_d,pos_i,pos_f);

}

int main(){

    freopen("arbint.in","rt",stdin);
    freopen("arbint.out","wt",stdout);

    scanf("%d %d",&n,&m);

    for(int i = 1; i <= n ; i++){
        scanf("%d",&f);
        update(1,1,n,f,i);
    }

    for(int i = 1 ; i <= m ; i++){
        scanf("%d%d%d",&x,&a,&b);

        if( x == 1)
            update(1,1,n,b,a);
        else{
            h=-1;
            question(1,1,n,a,b);
            printf("%d\n",h);
        }

    }

    return 0;
}