Cod sursa(job #563557)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 25 martie 2011 13:45:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
using namespace std;

const int N = 100006;//100001
const int ARB = 1<<18;//putere 2 min > N
const int INF = 2000000000;

int v[N],n;
int arb[ARB]; int poz_frunza[N];

ifstream in("arbint.in");
ofstream out("arbint.out");

int max(int a, int b)
{
	return (a>b)?a:b;
}


void gasire_frunze(int st, int dr, int poz)
{
	int mij;
	if (st == dr)
	{
		poz_frunza[st] = poz;
		return;
	}
	mij = (st+dr)/2;
	gasire_frunze(st,mij,2*poz);
	gasire_frunze(mij+1,dr,2*poz+1);
}

void actualizare_valoare(int i, int val)
{
	int poz = poz_frunza[i];
	arb[poz] = val;
	for (poz /= 2; poz >= 1; poz /= 2)
		arb[poz] = max(arb[2*poz],arb[2*poz+1]);
}

int x,y;//x;y folositi de query
int query(int st, int dr, int poz)
{
	if ((x <= st)&&(dr <= y))//intervalul [st,dr] este folosit in intregime la raspundere
		return arb[poz];
	if ((dr < x)||(y < st))//intervalul [st,dr] este complet inutil in raspunderea pt intervalul [a,b];
		return -INF;
	int mij = (st+dr)/2;
	return max(query(st,mij,2*poz),query(mij+1,dr,2*poz+1));
}

int interogare(int a, int b)
{
	x = a;
	y = b;
	return query(1,n,1);
}

void citire_si_rezolvare()
{
	int q,op,x,y;
	in>>n>>q;
	gasire_frunze(1,n,1);
	for (int i = 1; i <= n; ++i)
	{
		in>>v[i];
		actualizare_valoare(i,v[i]);
	}
	for (int i = 1; i <= q; ++i)
	{
		in>>op>>x>>y;
		if (op == 0)
			out<<interogare(x,y)<<"\n";
		else
			actualizare_valoare(x,y);
	}
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	citire_si_rezolvare();
	return 0;
}