Cod sursa(job #1307429)

Utilizator andreismara97Smarandoiu Andrei andreismara97 Data 2 ianuarie 2015 05:00:36
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<cstdio>
#include<algorithm>
using namespace std;

#define NMax 100001

int MaxArb[2*NMax];
int Q, N, pos, val, maxim, start, finish;


void Update(int,int,int);
void Query(int,int,int);

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

    int x,A,B;

    scanf("%d %d\n",&N,&Q);
    for(int i=1;i<=N;i++)
    {
        scanf("%d ",&x);
        pos=i;  val=x;
        Update(1,1,N);
    }

    for(int i=1;i<=Q;i++)
    {
        scanf("%d %d %d\n",&x,&A,&B);
        if(x==0)
        {
            maxim=-1;
            start=A; finish=B;
            Query(1,1,N);
            printf("%d\n",maxim);
        }
        else
        {
            pos=A;  val=B;
            Update(1,1,N);
        }
    }

}

void Update(int nod, int left, int right)
{
    if(left==right)
    {
        MaxArb[nod]=val;
        return;
    }
    int mij = (left + right)/2;
    if(pos <= mij)  Update(nod*2,   left,  mij);
    else            Update(nod*2+1, mij+1, right);

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

void Query(int nod, int left, int right)
{
    if( start<=left  &&  right<=finish)
    {
        if(MaxArb[nod] > maxim) maxim=MaxArb[nod];
         return;
    }

    int mij= (left + right)/2;
    if( start<=mij )    Query(nod*2,   left,  mij);
    if( mij   <finish)  Query(nod*2+1, mij+1, right);
}