Cod sursa(job #164710)

Utilizator c_sebiSebastian Crisan c_sebi Data 24 martie 2008 18:33:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>

#define DIM 262144


int A[DIM], n, m, maxim;

inline int Max(int a, int b){
	return a>b?a:b;
}


void update(int nod, int st, int dr, int poz, int val){
	if(st == dr){
		A[nod] = val;
	}
	else {
		int m = (st+dr)/2;
		if(poz <= m) update(2*nod, st, m, poz, val);
		else update(2*nod+1, m+1, dr, poz, val);
		A[nod] = Max(A[2*nod], A[2*nod+1]);
	}
}

int query(int nod, int st, int dr, int a, int b){
	if(a<=st && dr<=b)
		{if(A[nod]>maxim) maxim=A[nod];}
	else{
		int m = (st+dr)/2, v1=0, v2=0;
		if(a<=m) v1 = query(2*nod, st, m, a, b);
		if(b>m) v2 = query(2*nod+1, m+1, dr, a, b);
		//return Max(v1, v2);
	}
}

int main(){
	int i, u, v, t;
	FILE *f=fopen("arbint.in", "r");
	FILE *g=fopen("arbint.out", "w");
	fscanf(f, "%d %d", &n, &m);
	for(i=1; i<=n; i++){
		fscanf(f, "%d", &u);
		update(1, 1, n, i, u);
	}
	for(i=1; i<=m; i++){
		fscanf(f, "%d %d %d", &t, &u, &v);
		if(t==1) update(1, 1, n, u, v);
		else {maxim=-1; query(1, 1, n, u, v); fprintf(g, "%d\n", maxim); }
	}

	fclose(f);
	fclose(g);
	return 0;
}