Cod sursa(job #1445854)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 31 mai 2015 11:31:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>
const int Lim = 300005;

int N,M,Op,A,B,Val,Pos,Sol;
int Arb[Lim];

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

inline int Max(int A,int B)
{
    return (A > B) ? A : B;
}

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",&Val);
         Pos = i;
         Update(1,1,N);
     }

     for (int i = 1;i <= M;i++)
     {
         scanf("%d%d%d",&Op,&A,&B);
         if (Op == 0)
         {
             Sol = 0;
             Query(1,1,N);
             printf("%d\n",Sol);
         }
         else
         {
             Pos = A; Val = B;
             Update(1,1,N);
         }
     }
}

void Update(int Node,int Left,int Right)
{
    if (Left == Right)
    {
        Arb[Node] = Val;
        return;
    }

    int Med = (Left + Right) / 2;
    if (Pos <= Med) Update(2*Node,Left,Med);
               else Update(2*Node+1,Med+1,Right);

    Arb[Node] = Max(Arb[2*Node],Arb[2*Node+1]);
}

void Query(int Node,int Left,int Right)
{
    if (A <= Left && Right <= B)
    {
        Sol = Max(Sol,Arb[Node]);
        return;
    }

    int Med = (Left + Right) / 2;
    if (A <= Med) Query(2*Node,Left,Med);
    if (Med < B)  Query(2*Node+1,Med+1,Right);
}