Cod sursa(job #2563860)

Utilizator dragossofiaSofia Dragos dragossofia Data 1 martie 2020 15:27:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m,b[100000],a[400066],qs,qf,val,poz;
void citire()
{
 fin>>n>>m;
 for ( int i = 1 ; i <= n ; i ++ )
        {
         fin>>b[ i ];
        }
}

void arint(int s , int d , int p)
{
 if( s == d )
    {
     a[ p ] = b[ d ];

     return ;
    }
 int mid;
 mid=( d + s ) / 2 ;
 arint( s , mid , 2 * p  );
 arint( mid + 1 , d, 2 * p + 1 );
 a[ p ]=max( a[ 2 * p ], a[ 2 * p + 1 ]);

}

int querry( int  s , int   d , int p )
{
 if( qs <= s && d <= qf)
        return a[ p ];
 if( d < qs  || s > qf )
        return 0 ;
 int mid=( s + d ) / 2;
 return max( querry( s , mid , 2 * p ) , querry( mid + 1 , d , 2 * p + 1) );

}

void update( int s , int d , int p )
{
 if( s == d )
    {
     a[p]=val;
     return ;
    }
 int mid= ( s + d ) / 2 ;
 if( poz <= mid )
       update( s, mid , 2 * p );
 else
       update( mid + 1 , d , 2 * p + 1 );
 a[ p ] = max( a[ 2 * p ] , a[ 2 * p + 1] );

}

int main()
{   citire();
    arint( 1 , n , 1 );
    int task;
    for(int i = 1 ; i <= m ; i++ )
        {
         fin>>task;
         //cout<<task<<" ";
         if( task == 1 )
                {
                 fin>>poz>>val;
                 update( 1 , n , 1 );
                }
         else
                {
                 fin>>qs>>qf;
                 fout<<querry( 1 , n , 1 )<<"\n";
                }
        }
    return 0;
}