Cod sursa(job #907458)

Utilizator superman_01Avramescu Cristian superman_01 Data 7 martie 2013 22:51:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cstdio>

#define NMAX 400005
#define max(a,b) ((a)>(b)?(a):(b))

FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");

using namespace std;

int v[NMAX],N,M;
int start,finish,val,pos,MAX;
void Update(int,int,int);
void  Query(int,int,int);

int main( void )
{
    fscanf(f,"%d%d",&N,&M);
    int x;
    for(int i(1); i <= N ; ++i )
    {
        fscanf(f,"%d",&x);
        pos=i;
        val=x;
         Update(1,1,N);
    }
   int tip,a,b;
    for(int i(1); i <= M ; ++i )
    {
        fscanf(f,"%d%d%d",&tip,&a,&b);
        if( tip == 1 )
        {
            pos=a;
            val=b;
            Update(1,1,N);
           continue;
        }
        if( tip == 0 )
        {
            MAX=0;
            start=a;
            finish=b;
            Query(1,1,N);
            fprintf(g,"%d\n",MAX);
            continue;

        }

    }


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

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


}
void Query(int nod, int left, int right)
{

       if(start<=left && right <= finish)
       {
           if(MAX<v[nod]) MAX=v[nod];
         return ;
       }


       int  mid=(left+right)/2;

        if( start <=  mid )
            Query( 2*nod,left,mid);

        if(mid<finish)
           Query(2*nod+1,mid+1,right);







}