Cod sursa(job #212119)

Utilizator recviemAlexandru Pana recviem Data 4 octombrie 2008 14:14:35
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <stdio.h>
#define nmax 200000
using namespace std;
long long n,m,a[nmax],arb[1000000];

void q_max(long long nod, long long a, long long b, long long x, long long y);
void _update(long long nod, long long x,long long y,long long dest, long long val);
long long _max;

void citire()
{
    freopen("arbint.in","r",stdin);
    scanf("%lld %lld",&n,&m);
    for (long long i=1;i<=n;i++)
        scanf("%lld",&a[i]);
}

void main_loop()
{
    for (long long i=0;i<m;i++)
    {
        long long t,x,y;
        scanf("%lld %lld %lld",&t,&x,&y);
        if (t)
            _update(1,1,n,x,y);
        else
        {
            _max = a[x];
            q_max(1,1,n,x,y);
            printf("%lld\n",_max);
        }
    }
}

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

void _update(long long nod, long long x,long long y,long long dest, long long val)
{
    long long left    = (nod << 1),
        right   = (nod << 1) +1,
        mid     = (x+y)>>1;

    if (x>y)
        return ;
    if (x == y)
    {
        arb[nod] = val;
        return;
    }
    if (dest <= mid)
        _update(left,x,mid,dest,val);
    else
        _update(right,mid+1,y,dest,val);
    arb[nod] = max(arb[left],arb[right]);

}

// nod contine long longervalul [a,b]
// long longervalul cautat este [x,y]

void q_max(long long nod, long long a, long long b, long long x, long long y)
{

    long long left    = (nod << 1),
        right   = (nod << 1) +1,
        mid     = (a+b)>>1;

    if (a>b)
        return;

    // daca long longervalul [x,y] este inclus in [a,b]
    if (a >= x && b <= y)
    {
        // verificam maximul
        _max = arb[nod]>_max?arb[nod]:_max;
        return;
    }

    if (x<=mid && y>=a)
        q_max(left,a,mid,x,y);
    if (y>mid && x<=b)
        q_max(right,mid+1,b,x,y);
}

void build(long long nod,long long x, long long y)
{
    long long left    = (nod << 1),
        right   = (nod << 1) +1,
        mid     = (x+y)>>1;

    if (x>y)
        return;

    if (x == y)
    {
        arb[nod] = a[x];
        return;
    }
    build(left,x,mid);
    build(right,mid+1,y);
    arb[nod] = max(arb[left],arb[right]);

}

int main()
{
    freopen("arbint.out","w",stdout);
    citire();
    build(1,1,n);
    main_loop();
    return 0;
}