Cod sursa(job #493737)

Utilizator marius21Marius Petcu marius21 Data 19 octombrie 2010 11:47:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <cstdlib>

FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");

#define INF 0x3f3f3f3f

int v[100000];
int a[0x40000];

void act(int nod, int st, int en,int i, int nr)
{
	if (st==en)
	{
		if (st==i)
			a[nod]=nr;
	} else {
		int mij = (st+en)/2;
		if (i<=mij)
			act(nod*2+1,st,mij,i,nr);
		else
			act(nod*2+2,mij+1,en,i,nr);
		
		int max = 0;
		if (a[nod*2+1]>max)
			max = a[nod*2+1];
		if (a[nod*2+2]>max)
			max = a[nod*2+2];
		a[nod]=max;
	}
}

int max;

void query(int nod,int st, int en, int aa, int bb)
{
	if ((aa<=st) && (en<=bb))
	{
		if (a[nod]>max)
			max=a[nod];
 	} else {
		int mij = (st+en)/2;
		if (aa<=mij)
			query(nod*2+1,st,mij,aa,bb);
		if (mij<bb)
			query(nod*2+2,mij+1,en,aa,bb);
	}
}

int main (int argc, char * const argv[]) {
	int n,m;
	fscanf(fin, "%d%d", &n, &m);
	for (int i=0; i<n; i++)
	{
		int x;
		fscanf(fin, "%d", &x);
		act(0,0,n-1,i,x);
	}
	for (int i=0; i<m; i++)
	{
		int c,a,b;
		fscanf(fin, "%d%d%d",&c,&a,&b);
		if (c==0)
		{
			a--; b--;
			max = 0;
			query(0, 0, n-1, a, b);
			fprintf(fout, "%d\n",max);
		} else {
			a--;
			act(0, 0, n-1, a, b);
		}
	}
	fclose(fin);
	fclose(fout);
    return 0;
}