Cod sursa(job #1016524)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 octombrie 2013 13:49:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define Nmax 100099
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int N,M,Arb[4*Nmax+99],start,finish,val,poz,Max;

inline int Maxim(int a, int b)
{
       if (a>b) return a;
       return b;
}

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

     int middle=(left+right)/2;
     if (poz<=middle)Update(2*nod,left,middle);
             else    Update(2*nod+1,middle+1,right);
     Arb[nod]=Maxim(Arb[2*nod],Arb[2*nod+1]);
}

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

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

inline void ReadInput()
{
    f>>N>>M;
    for (int i=1;i<=N;++i)
    {
        f>>val; poz=i;
        Update(1,1,N);
    }
}



inline void Solve()
{
    for (int i =1;i<=M;++i)
    {
        int tip,a,b;
        f>>tip>>a>>b;
        if (!tip)
        {
             Max=-1;
             start=a,finish=b;
             Query(1,1,N);
             g<<Max<<'\n';
        }
        else
        {
            poz=a,val=b;
            Update(1,1,N);
        }
    }
}

int main()
{
    ReadInput();
    Solve();
    f.close();g.close();
    return 0;
}