Cod sursa(job #680634)

Utilizator marinMari n marin Data 15 februarie 2012 19:50:18
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
#define DIM 2000000
int n,m;
int v[DIM];
int maxim(int a, int b) {
	return a>b ? a : b;
}
void update(int st, int dr, int nod, int poz, int val) {
	int mij;
	if ((st==poz) && (dr==poz)) {
		v[nod] = val;
	} else {
		mij = (st+dr)/2;
		if (poz<=mij)
			update(st,mij,2*nod,poz,val);
		if (poz>mij)
			update(mij+1,dr,2*nod+1,poz,val);
		v[nod] = maxim(v[2*nod], v[2*nod+1]);
	}
}
int query(int st, int dr, int nod, int a, int b) {
	int max,x,mij;
	if ((a<=st) && (dr<=b)){
		return v[nod];
	} else {
		mij = (st+dr)/2;
		max =-1;
		if (a<=mij) {
			x = query(st, mij, 2*nod, a, b);
			max = maxim(max, x);
		}
		if (b>mij) {
			x = query(mij+1,dr, 2*nod+1, a, b);
			max = maxim(max, x);
		}
		return max;
	}
}
int main() {
	int val,poz,a,b,op,i;
	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",&val);
		update(1,n,1,i,val);
	}
	for (i=1;i<=m;i++) {
		fscanf(f,"%d",&op);
		if (op==0) {
			fscanf(f,"%d %d",&a, &b);
			fprintf(g,"%d\n",query(1,n,1,a,b));
		} else {
			fscanf(f,"%d %d",&poz, &val);
			update(1,n,1,poz,val);
		}
	}
	fclose(g);
	fclose(f);
	return 0;
}