Cod sursa(job #2200122)

Utilizator shantih1Alex S Hill shantih1 Data 30 aprilie 2018 13:37:28
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int nr,nra,n,m,o,v[100005],i,j,pos[100005],a,b,li,lf;

struct nod
{
	int t,f1,f2,mx;
} p, arb[160000];

int makearb(int st,int dr)
{
	int md=st+(dr-st)/2, id=nr;
	if(st==dr)	
	{
		arb[id].mx=v[st];
		pos[st]=nr;
	}
	else 
	{
		nr++;
		arb[nr].t=id;
		arb[id].f1=nr;
		arb[id].mx=makearb(st,md);
		nr++;
		arb[nr].t=id;
		arb[id].f2=nr;
		arb[id].mx=max(arb[id].mx,makearb(md+1,dr));
	}
	return arb[id].mx;
}

int maxab(int nr,int st,int dr)
{
	int md=st+(dr-st)/2,r=0;
	li=st;	lf=md;
	if(li>=a&&lf<=b)	r=max(r,arb[arb[nr].f1].mx);
	else if(max(li,a)<=min(lf,b))	r=maxab(arb[nr].f1,li,lf);
	
	li=md+1;lf=dr;
	if(li>=a&&lf<=b)	r=max(r,arb[arb[nr].f2].mx);
	else if(max(li,a)<=min(lf,b))	r=maxab(arb[nr].f2,li,lf);
	
	return r;
}

void update(int a,int b)
{
	int nr=pos[a];
	arb[nr].mx=b;
	while(nr!=1)
	{
		nr=arb[nr].t;
		arb[nr].mx=max(arb[arb[nr].f1].mx,arb[arb[nr].f2].mx);
	}
}

int main() {
	
	fin>>n>>m;
	for(i=1;i<=n;i++)
		fin>>v[i];
	
	nr=1;
	makearb(1,n);
	nra=nr;
	
	for(i=1;i<=m;i++)
	{
		fin>>o>>a>>b;
		if(o==0)	fout<<maxab(1,1,n)<<"\n";
		if(o==1)	update(a,b);
	}
}