Cod sursa(job #1398800)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 24 martie 2015 13:29:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include <vector>
#define NMax 100005
#define maxim(a,b)((a>b)?a:b)
using namespace std;
int n,m,x,y,z,val,pos,arb[4*NMax],maxi;
void update(int nod,int left,int right)
{
    if(left == right)
    {
        arb[nod] = val;
        return;
    }
    int mij = (left+right)/2;
    if( pos <= mij )update((nod<<1),left,mij);
    else update(((nod<<1)|1),mij+1,right);
    arb[nod] = maxim(arb[(nod<<1)],arb[((nod<<1)|1)]);
}
void query(int nod,int left,int right)
{
    if( y <= left && right <= z )
    {
        if(maxi<arb[nod])maxi = arb[nod];
        return;
    }

    int mij = (left+right)/2;
    if( y <= mij )query((nod<<1),left,mij);
    if( mij < z )query(((nod<<1)|1),mij+1,right);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&x);
        pos = i;val = x;
        update(1,1,n);
    }
    for(int i=1;i<=m;++i)
    {
        scanf("%d %d %d",&x,&y,&z);
        if(x==1)
        {
            pos = y;val = z;
            update(1,1,n);
        }
        else
        {
            maxi = -(1<<30);
            query(1,1,n);
            printf("%d\n",maxi);
        }
    }
    return 0;
}