Cod sursa(job #634079)

Utilizator eukristianCristian L. eukristian Data 15 noiembrie 2011 17:10:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cstdio>

#define dim 400066
#define buffSize 8192

int N, M, newVal, pos, A, B, maxim;
int MaxArb[dim];
FILE *f = fopen("arbint.in", "r");
char str[buffSize];

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

void query(int, int, int);
void update(int, int, int);

inline void readInt(int &val)
{
	static int pos = 0, len = 0;
	val = 0;
	if (pos == len)
	{
		len = fread(str, sizeof(char), buffSize, f);
		pos = 0;
	}
	while (pos < len && (str[pos] > '9' || str[pos] < '0'))
	{
		++pos;
		if (pos == len)
		{
			len = fread(str, sizeof(char), buffSize, f);
			pos = 0;
		}
	}
	while (pos < len && (str[pos] <= '9' && str[pos] >= '0'))
	{
		val = val * 10 + str[pos] - '0';
		pos++;
		
		if (pos == len)
		{
			len = fread(str, sizeof(char), buffSize, f);
			pos = 0;
		}
	}
}

int main()
{
	
	int a, x, y;
	freopen("arbint.out","w",stdout);

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

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

	for (int i = 1 ; i <= M ; ++i)
	{
		//scanf("%d %d %d", &a, &x, &y);
		readInt(a);readInt(x);readInt(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]);
}