Cod sursa(job #1221076)

Utilizator atatomirTatomir Alex atatomir Data 19 august 2014 13:23:13
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define maxN 100100

long aint[maxN << 4],a[maxN];
long n,m,i;
long tip,x,y;

void BuildAInt(long nod,long L,long R) {
    if(L == R){
        aint[nod] = a[L];
        return;
    }
    long M = (L+R) >> 1;
    BuildAInt(nod << 1,L,M);
    BuildAInt((nod << 1) + 1,M+1,R);

    aint[nod] = max(aint[nod << 1],aint[(nod << 1)+1]);
}

void Update(long nod,long L,long R,long dest,long val){
    if(L == R){
        aint[nod] = val;
        return;
    }
    long M = (L+R) >> 1;
    if(dest <= M)
        Update(nod << 1,L,M,dest,val);
    else
        Update((nod << 1) + 1,M+1,R,dest,val);
    aint[nod] = max(aint[nod << 1],aint[(nod << 1)+1]);
}

long Query(long nod,long L,long R,long qL,long qR) {
    if(qL <= L && R <= qR) return aint[nod];
    long M = (L+R) >> 1;

    long ans = 0;
    if(qL <= M) ans = max(ans,Query(nod << 1,L,M,qL,qR));
    if(qR > M) ans = max(ans,Query((nod << 1)+1,M+1,R,qL,qR));
    return ans;
}

int main()
{
    freopen("aint.in","r",stdin);
    freopen("aint.out","w",stdout);

    scanf("%ld %ld\n",&n,&m);
    for(i=1;i<=n;i++) scanf("%ld",&a[i]);

    BuildAInt(1,1,n);

    for(i=1;i<=m;i++){
        scanf("%ld %ld %ld",&tip,&x,&y);
        if(tip == 0){
            long ans = Query(1,1,n,x,y);
            printf("%ld\n",ans);
        } else {
            Update(1,1,n,x,y);
        }
    }

    return 0;
}