Cod sursa(job #1208964)

Utilizator Pintilie_AndreiFII-Pintilie Andrei Pintilie_Andrei Data 16 iulie 2014 21:04:32
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <algorithm>
#define N 100003
using namespace std;
int arbi[4*N];
int n,m;
int pos,val,start,stop,maxim;

void Update(int nod,int left,int right)
{
    if(left==right)
    {
        arbi[nod]=val;
        return ;
    }

    int mij;
    mij=(left+right)/2;
    if(pos<=mij) Update(2*nod,left,mij);
    else Update(2*nod+1,mij+1,right);

    arbi[nod]=max(arbi[2*nod],arbi[2*nod+1]);
}

void Query(int nod,int left,int right)
{
    if(start<=left && right<=stop)
    {
        if(maxim<arbi[nod]) maxim=arbi[nod];
        return;
    }
    int mij;
    mij=(left+right)/2;
    if(mij>=start) Query(2*nod,left,mij);
    if(mij<stop) Query(2*nod+1,mij+1,right);
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    int i,x,j,op,q,p;
    for(i=1; i<=n; i++)
    {
        scanf("%d",&x);
        pos=i;
        val=x;
        Update(1,1,n);

    }

    for(i=1; i<=n; i++)
    {
        scanf("%d %d %d ",&op,&p,&q);
        if(op)
        {
            pos=p;
            val=q;
            Update(1,1,n);
        }
        else
        {
            start=p;
            stop=q;
            maxim=0;
            Query(1,1,n);
            printf("%d ",maxim);

        }
    }
    return 0;
}