Cod sursa(job #634048)

Utilizator eukristianCristian L. eukristian Data 15 noiembrie 2011 16:24:25
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <fstream>
#include <assert.h>  
using namespace std;

#define in "arbint.in"
#define out "arbint.out"
#define dim 100001

int N, M, newVal, pos, A, B, maxim;
int MaxArb[4*dim+66];

inline int Maxim(int a, int b) {
       if ( a > b ) return a;
       return b;
}

void query(int node, int st, int dr);
void update(int node, int st, int dr);

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

	scanf("%d %d", &N, &M);

	for (int i = 1 ; i <= N ; ++i)
	{
		scanf("%d", &newVal);
		pos = i;
		update(1, 1, N);
	}

	for (int i = 1 ; i <= M ; ++i)
	{
		int a, x, y;
		scanf("%d %d %d", &a, &x, &y);
		if (a == 0)
		{
			maxim = -1;
			A = x;B = y;
			query(1, 1, N);
			printf("%d\n", maxim);
		}
		else
		{
			newVal = y;
			pos = x;
			update(1, 1, N);
		}
	}

	return 0;
}

void query(int node, int st, int dr)
{
	if (st >= A && dr <= B)
	{
		if (MaxArb[node] > maxim)
			maxim = MaxArb[node];
		return;
	}

	int mid = (st + dr) >> 1;
	
	if (A <= mid) query((node << 1), st, mid);
	if (B > mid) query((node << 1) | 1, mid + 1, dr); 
}

void update(int node, int st, int dr)
{
	if (st >= dr)
	{
		MaxArb[node] = newVal;
		return;
	}

	int mid = (st + dr) >> 1;
	if (pos <= mid)
		update(node << 1, st, mid);
	else
		update((node << 1) | 1, mid + 1, dr);
	MaxArb[node] = Maxim(MaxArb[node << 1], MaxArb[(node << 1) | 1]);
}