Cod sursa(job #1611750)

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

//#define dim 100001;
using namespace std;


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

int h,pos_i,pos_f,pos_h;

int ar [4 * 10000001 + 66 ];

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

    int div=(ext_s+ext_d)/2;

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

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

void question (int nod,int ext_s,int ext_d){
    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);
        if(div < pos_f)
            question(2*nod+1,div+1,ext_d);

}

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);
        h=f;
        pos_h=i;
        update(1,1,n);
    }

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

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

    }

    return 0;
}