Cod sursa(job #411196)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 4 martie 2010 19:18:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#define maxim(a,b) (a>b ? a : b)
int n,k;
int arb[262144],max;

void update (int n,int l,int r,int poz,int val)
{
    if(l==r)
    {
        arb[n] = val;
        return ;
    }

    int m = (l + r) / 2;
    if(poz<=m)
        update(2*n,l,m,poz,val);
    else
        update(2*n+1,m+1,r,poz,val);
    arb[n]=maxim(arb[2*n],arb[2*n+1]);
}

void query(int n,int l,int r,int a,int b)
{
    if (a <= l && r <= b)
    {
        if (max < arb[n])
            max = arb[n];
        return ;
    }
    int m=(l+r)/2;
    
    if(a <= m)
        query(2*n, l, m, a, b);
    if(b > m)
        query(2*n+1, m+1, r, a, b);
}

int main ()
{
    int i,v,a,b,tip;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&v);
        update(1, 1, n, i, v);
    }
    for (;k;k--)
    {
        scanf("%d%d%d",&tip,&a,&b);
        if(tip==1)
            update(1,1,n,a,b);
        else
        {
            max = 0;
            query(1,1,n,a,b);
            printf("%d\n",max);
        }
    }
    return 0;
}