Cod sursa(job #1043639)

Utilizator Lucian-GeorgeFMI Popa Lucian George Lucian-George Data 28 noiembrie 2013 20:48:14
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<iostream>
#include<fstream>
using namespace std;
long arb[100001],a,b,maxim,val,v[100001],n,maxpoz=0;
long max(long a, long 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]; if (poz>maxpoz) maxpoz=poz;}
	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, int a, int val)
{
	if (st==dr) arb[poz]=val;
	else 
	{
		int mij=(st+dr)/2;
		if (a<mij) update(poz*2,st,mij,a,val);
		else update(poz*2+1,mij+1,dr,a,val);
	}
	//arb[poz]=max(arb[poz*2],arb[poz*2+1]);
	arb[poz/2]=max(arb[poz],arb[poz+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,a,b);
	}
	//for (i=1; i<=maxpoz; i++) cout<<arb[i]<<" ";
	return 0;
}