Cod sursa(job #1835496)

Utilizator silkMarin Dragos silk Data 26 decembrie 2016 22:35:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <algorithm>
#define NMax 262144
using namespace std;

int aint[NMax+1];
int N,n;

void Update(int p, int x)
{
    int tata;

    p = N+p-1;
    aint[p] = x;
    while(p > 1)
    {
        if(p%2) --p;
        tata = p/2;
        aint[tata] = max(aint[p], aint[p+1]);
        p = tata;
    }
}

int Query(int p, int x, int y, int st, int dr)
{
    if(st==x && dr==y)
    return aint[p];

    int mid = (st+dr)/2;
    if(y <= mid) return Query(2*p,x,y,st,mid);
    else if( mid+1 <= x) return Query(2*p+1,x,y,mid+1,dr);
    return max( Query(2*p,x,mid,st,mid), Query(2*p+1,mid+1,y,mid+1,dr) );
}

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

    int i,op,x,y,M;

    scanf("%d %d",&n,&M);
    for(N = 1; N < n; N *=2);
    for(i = 1; i <= n; ++i)
    {
        scanf("%d",&x);
        aint[N+i-1] = x;
    }
    for(i = N-1; i >= 1; --i) aint[i] = max( aint[2*i], aint[2*i+1] );
    for(i = 1; i <= M; ++i)
    {
        scanf("%d %d %d",&op,&x,&y);
        if(op==0)
            printf("%d\n", Query(1,x,y,1,N) );
        else
            Update(x,y);
    }


return 0;
}