Cod sursa(job #563556)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 25 martie 2011 13:41:01
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>

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];

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;
	scanf("%d%d",&n,&q);
	gasire_frunze(1,n,1);
	for (int i = 1; i <= n; ++i)
	{
		scanf("%d",&v[i]);
		actualizare_valoare(i,v[i]);
	}
	for (int i = 1; i <= q; ++i)
	{
		scanf("%d%d%d",&op,&x,&y);
		if (op == 0)
			printf("%d\n",interogare(x,y));
		else
			actualizare_valoare(x,y);
	}
}

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