Nu aveti permisiuni pentru a descarca fisierul grader_test6.ok

Cod sursa(job #156633)

Utilizator snaked31Stanica Andrei snaked31 Data 12 martie 2008 17:53:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>

#define nm 100010


int ai[5*nm];
int n, m, i, x, y, z;

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


void upd(int node, int a, int b, int p, int x)

{
	int mid = (a + b)/2;
	if (a == b)
		ai[node] = x;
	else
	if (p > mid)
	{
		upd(2*node+1, mid+1, b, p, x);
		ai[node] = MX(ai[2*node], ai[2*node+1]);
	}
	else
	if (p <= mid)
	{
		upd(2*node, a, mid, p, x);
		ai[node] = MX(ai[2*node], ai[2*node+1]);
	}
}



int query(int node, int a, int b, int x, int y)

{
	int mid = (a + b)/2;

	if (a == b)
		return ai[node];
	if (a == x && b == y)
		return ai[node];

	if (x <= mid)
	{
		if (y > mid)
		{
			return MX(query(2*node, a, mid, x, mid), query(2*node+1, mid+1, b, mid+1, y));
		}
		else
			return query(2*node, a, mid, x, y);
	}
	else
		return query(2*node+1, mid+1, b, x, y);
}


void read()

{
	scanf("%d %d ", &n, &m);
	for (i=1; i<=n; ++i)
	{
		scanf("%d ", &x);
		upd(1, 1, n, i, x);
	}
}


void solve()

{
	for (i=1; i<=m; ++i)
	{
		scanf("%d %d %d", &x, &y, &z);
		if (x == 0)
		{
			printf("%d\n", query(1, 1, n, y, z));
		}
		else
		{
			upd(1, 1, n, y, z);
		}
	}
}


void write()

{

}


int main()

{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out","w",stdout);

	read();
	solve();
	write();

	return 0;
}