Cod sursa(job #1315548)

Utilizator CartofJohnsonFMI Tanasescu Andrei CartofJohnson Data 12 ianuarie 2015 21:49:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <fstream>
#include <assert.h> 
using namespace std;
#define dim 100001
#define maxim(a,b) (a>b?a:b)
int n, m;
int maxArb[4*dim+66];
int start, finish, val, Pos, maxim;
  
void Update(int nod, int left, int right){
	if ( left == right ){maxArb[nod] = val;return;}
	int div = (left+right)/2;
	if ( Pos <= div ) Update(2*nod,left,div);
	else Update(2*nod+1,div+1,right);
	maxArb[nod] = maxim( maxArb[2*nod], maxArb[2*nod+1] );
}
void Query(int nod, int left, int right){
	if(start<=left && right<=finish){
		if (maxim<maxArb[nod])maxim=maxArb[nod];
		return;
	}
	int div = (left+right)/2;
	if(start<=div)Query(2*nod,left,div);
	if(div<finish)Query(2*nod+1,div+1,right);
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int x, A, B;
    scanf("%d%d", &n, &m);
    for (int i=1; i<=n;i++){
        scanf("%d", &x);
        Pos = i, val = x;
        Update(1,1,n);
    }
    for ( int i = 1; i <= m; i++ ){
        scanf("%d%d%d", &x, &A, &B);
        if ( x == 0 ){
			maxim = -1;
			start = A, finish = B;
			Query(1,1,n);
			printf("%d\n", maxim);
        }else{
            Pos = A, val = B;
            Update(1,1,n);
        }
    }
}