Cod sursa(job #843779)

Utilizator matei_cChristescu Matei matei_c Data 28 decembrie 2012 13:46:50
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

#define maxarb 300001

int arbore[maxarb] ;

int n, m ;

int sol ;

void modifica(int value, int poz, int nod, int st, int dr)
{
    if( st == dr )
    {
        arbore[nod] = value ;
        return ;
    }

	int mij = ( st + dr ) >> 1 ;
	int fiust = 2 * nod ;
	int fiudr = 2 * nod + 1 ;
	
    if( poz <= mij )
		modifica( value, poz, fiust, st, mij ) ;
    else
		modifica( value, poz, fiudr, mij + 1, dr ) ;
 
    arbore[nod] = max( arbore[fiust], arbore[fiudr] ) ;
}
 
void query(int a, int b, int nod, int st, int dr)
{
    if( a <= st && dr <= b )
    {
        sol = max( sol, arbore[nod] ) ;
        return;
    }

	int mij = ( st + dr ) >> 1 ;
	int fiust = 2 * nod ;
	int fiudr = 2 * nod + 1 ;
	
    if( a <= mij )
		query( a, b, fiust, st, mij ) ;
	
    if( mij < b )
		query( a, b, fiudr, mij + 1, dr ) ;
}
 
int main()
{

	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
 
    scanf("%d%d", &n, &m);
	
    for(int i = 1; i <= n; ++i )
    {
       int x ;
	   scanf("%d", &x);
       modifica( x, i, 1, 1, n ) ;
    }
    for(int i = 1; i <= m; ++i )
    {
		int cod, a, b ;
        
		scanf("%d%d%d", &cod, &a, &b );
        
		if( cod == 0 )
        {
            sol = -1 ;
            query( a, b, 1, 1, n ) ;
            printf("%d\n", sol);
        }
        else
            modifica( b, a, 1, 1, n ) ;
    }
}