Cod sursa(job #2200964)

Utilizator shantih1Alex S Hill shantih1 Data 2 mai 2018 22:30:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#define ll long long
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

ll nr,nra,n,m,o,v[100015],i,j,rc,pos[100015],a,b,li,lf,rm;

struct nod
{
	ll t,f1,f2,mx;
} p, arb[200000];

ll makearb(ll st,ll dr)
{
	ll 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;
}

ll maxab(ll nr,ll st,ll dr)
{
	ll md=st+(dr-st)/2,r=0;
	
	li=st;  lf=md;
	if(li>=a&&lf<=b)  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=max(r,maxab(arb[nr].f2,li,lf));
 
	return r;
}

void update(ll a,ll b)
{
	ll 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);   v[a]=b;	}
	}
}