Cod sursa(job #712210)

Utilizator halianStefanca Stefan halian Data 13 martie 2012 10:08:21
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <stdio.h>
#define FI fopen("arbint.in","r")
#define FO fopen("arbint.out","w")
long max(long a,long b) {if(a>b) return a; return b;}

struct Nod {
	long val;
	struct Interval {
		long st,dr;
		long mij() {
			return (st+dr)/2;
		};
	} interval;
} nod[131072];
long n,m;
FILE *fi,*fo;

void create(long sir[],long lim) {
	long i,j,mij;
	j=1;
	i=1;
	nod[1].interval.st=1;
	nod[1].interval.dr=n;
	while(i) {
		if(j<=nod[i].interval.dr) {
			mij=nod[i].interval.mij();
			if(j<=mij) {
				i*=2;
				nod[i].interval.st=nod[i/2].interval.st;
				nod[i].interval.dr=mij;
			}
			else {
				i=i*2+1;
				nod[i].interval.st=mij+1;
				nod[i].interval.dr=nod[i/2].interval.dr;
			}
			if(j==nod[i].interval.st && j==nod[i].interval.dr) {
				nod[i].val=sir[j-1];
				++j;
				i/=2;
			}
		}
		else {
			nod[i].val=max(nod[i*2].val,nod[i*2+1].val);
			i/=2;
		}
	}
}

void cit(FILE *f) {
	long i,vec[100000];
	fscanf(f,"%li%li",&n,&m);
	for(i=0;i<n;i++)
		fscanf(f,"%li",&vec[i]);
	create(vec,n);
}

void update(long nd,long a,long b) {
	long mij;
	mij=nod[nd].interval.mij();
	if(nod[nd].interval.st==a && nod[nd].interval.dr==a) {
		nod[nd].val=b;
		return;
	}
	if(a<=mij)
		update(nd*2,a,b);
	else
		update(nd*2+1,a,b);
	nod[nd].val=max(nod[nd*2].val,nod[nd*2+1].val);
}
void update(long a,long b) {update(1,a,b);}

long query(long nd,long a,long b) {
	long mij=nod[nd].interval.mij(),ret=0;
	if((a<=nod[nd].interval.st && nod[nd].interval.dr<=b) || nod[nd].interval.st==nod[nd].interval.dr)
		return nod[nd].val;
	if(a<=mij)
		ret=max(ret,query(nd*2,a,b));
	if(b>mij)
		ret=max(ret,query(nd*2+1,a,b));
	return ret;
}
long query(long a,long b) {return query(1,a,b);}

int main() {
	long i,a,b,st;
	fi=FI;
	fo=FO;
	cit(fi);
	for(i=0;i<m;i++) {
		fscanf(fi,"%li%li%li",&st,&a,&b);
		if(st)
			update(a,b);
		else {
			fprintf(fo,"%li\n",query(a,b));
		}
	}
	return 0;
}