Cod sursa(job #738770)

Utilizator Nicusor002Telechi Nicolae Nicusor002 Data 21 aprilie 2012 15:00:32
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
int n,m,v[100000*2];

inline int max(int a,int b){return a>b?a:b;}

void update(int nod,int poz,int comp,int st,int dr){
    if(st==dr){
        v[nod]=comp;
        return;
    }else{
        int mid=(st+dr)/2;
        if(poz<=mid)
            update(nod*2,poz,comp,st,mid);
        else
            update(nod*2+1,poz,comp,mid+1,dr);
        v[nod]=max(v[nod*2],v[nod*2+1]);
    }
}

void query(int nod,int pozst,int pozdr,int st,int dr,int &maxint){
    if(pozst<=st && dr<=pozdr){
        maxint=max(maxint,v[nod]);
        return;
    }
    int mid=(st+dr)/2;
    if(pozst<=mid)
        query(nod*2,pozst,pozdr,st,mid,maxint);
    if(pozdr>mid)
        query(nod*2+1,pozst,pozdr,mid+1,dr,maxint);
}

int main(){
    int i,x,y,maxint,code;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d\n",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%d",&x);
        update(1,i,x,1,n);
    }
    while(m--){
        scanf("%d %d %d\n",&code,&x,&y);
        switch(code){
            case 1:
                update(1,x,y,1,n);
                break;
            case 0:
                maxint=0;
                query(1,x,y,1,n,maxint);
                printf("%d\n",maxint);
                break;
        }
    }
    return 0;
}