Cod sursa(job #1043475)

Utilizator Lucian-GeorgeFMI Popa Lucian George Lucian-George Data 28 noiembrie 2013 17:34:48
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<iostream>
#include<fstream>
using namespace std;
int arb[100001],a,b,maxim,val,v[100001],n;
int max(int a, int b)
{
	if (a<b) return b;
	else return a;
}

void create(int poz, int st, int dr)
{
	int mij;
	if (st==dr) arb[poz]=v[st];
	else 
	{
		mij=(st+dr)/2;
		create(poz*2,st,mij);
		create(poz*2+1,mij+1,dr);
		arb[poz]=max(arb[poz*2],arb[poz*2+1]);
	}
}
void update(int poz,int st,int dr)
{
	if (st==dr) arb[poz]=b;
	else 
	{
		int mij=(st+dr)/2;
		if (a<=mij) update(poz*2,st,mij);
		else update(poz*2+1,mij+1,dr);
		//arb[poz]=max(arb[poz*2],arb[poz*2+1]);
	}
	arb[poz]=max(arb[poz*2],arb[poz*2+1]);
}

void verif(int poz,int st, int dr)
{
	if (a<=st && b>=dr) {if (arb[poz]>maxim) maxim=arb[poz];}
	else 
	{
		int mij=(st+dr)/2;
		if (a<=mij) verif(2*poz,st,mij);
		if (b>mij) verif(2*poz+1,mij+1,dr);
	}
}
	

int main()
{
	int i,o,x,m;
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	f>>n>>m;
	for (i=1; i<=n; i++)
		f>>v[i];
	create(1,1,n);
	for (i=1; i<=m; i++)
	{
		f>>o>>a>>b;
		if (o==0)
		{
			maxim=0;
			verif(1,1,n);
			g<<maxim<<endl;
		}
		else update(1,1,n);
	}
	return 0;
}