Cod sursa(job #165355)

Utilizator vlad.maneaVlad Manea vlad.manea Data 25 martie 2008 21:15:52
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>

#define nmax 100005

int s, N, M, c, i, t, a, b;

int X[nmax], Y[nmax], K[nmax], C[nmax], cate[nmax][66];

void msort(int l, int r)
{
	if (l >= r)
		return;

	int m = (l+r)>>1, i, j, k;

	for (i = k = l, j = m+1; i <= m && j <= r; ++k)
	{
		if (X[i] < X[j])
		{
			Y[k] = X[i];
			K[k] = C[i];
			++i;
		}
		else
		{
			Y[k] = X[j];
			K[k] = C[j];
			++j;
		}
	}

	for (; i <= m; ++i, ++k)
	{
		Y[k] = X[i];
		K[k] = C[k];
	}

	for (; j <= r; ++j, ++k)
	{
		Y[k] = X[k];
		K[k] = C[k];
	}

	for (k = l; k <= r; ++k)
	{
		X[k] = Y[k];
		C[k] = K[k];
	}
}

int b_match(int c, int l, int r)
{
	if (l > r)
		return 0;

	int m = (l+r)>>1;

	if (X[m] < c)
		return b_match(c, m+1, r);

	if (X[m] > c)
		return b_match(c, l, m-1);

	return m;
}

int b_right(int p, int l, int r)
{
	if (l > r)
		return s;

	int m = (l+r)>>1;

	if (p < X[m])
		b_right(p, l, m-1);
	else
	{
		s = m;
		b_right(p, m+1, r);
	}

	return s;
}

void muta(int i, int j)
{
	X[b_match(i, 1, N)] = i+j;
}

int query(int a, int b)
{
	int l = b_right(a-1, 1, N);

	int r = b_right(b, 1, N);

	int m = 0;

	for (c = 1; c <= 64; ++c)
		if (cate[r][c] - cate[l][c] > m)
			m = cate[r][c] - cate[l][c];

	return m;
}

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

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

	for (i = 1; i <= N; ++i)
		scanf("%d%d", &X[i], &C[i]);

	// sortez dupa coordonata
	msort(1, N);

	for (i = 1; i <= N; ++i)
		for (c = 1; c <= 64; ++c)
			cate[i][c] = cate[i-1][c] + (C[i]==c);

	while (M--)
	{
		scanf("%d%d%d", &t, &a, &b);

		if (t == 0)
			muta(a, b);
		else
			printf("%d\n", query(a, b));
	}

	return 0;
}