Cod sursa(job #1075585)

Utilizator iarbaCrestez Paul iarba Data 9 ianuarie 2014 11:17:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
using namespace std;
int arb[270000],i,st,sf,v,p,maxim,n,m,k;
long maxx(long a, long b)
{if(a>b){return a;}else{return b;}}
void update(long nod,long left,long right)
{
    if(left==right){arb[nod]=v;}
    else{
        long mid=(left+right)/2;
        if(p<=mid){update(2*nod,left,mid);}
        else{update(2*nod+1,mid+1,right);}
        arb[nod]=maxx(arb[2*nod],arb[2*nod+1]);
        }
}
void query(long nod,long left,long right)
{
    if((st<=left)&&(sf>=right)){
        maxim=maxx(maxim,arb[nod]);
                               }
    else{
        long mid=(left+right)/2;
        if(st<=mid)query(2*nod,left,mid);
        if(mid<sf)query(2*nod+1,mid+1,right);
        }
}
 
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){scanf("%d",&v);p=i;update(1,1,n);}
    for(i=1;i<=m;i++){
        scanf("%d",&k);
        if(k==1){scanf("%d%d",&p,&v);update(1,1,n);}
        if(k==0){scanf("%d%d",&st,&sf);maxim=0;query(1,1,n);printf("%d\n",maxim);}
                     }
}