Cod sursa(job #161168)

Utilizator wefgefAndrei Grigorean wefgef Data 17 martie 2008 17:49:58
Problema Marbles Scor Ascuns
Compilator cpp Status done
Runda Marime 1.42 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
using namespace std;

#define mp make_pair
#define x first
#define y second

#define INF 2000000000
#define MAXN 100005
#define MAXC 64

int N, M;
pair<int, int> Bila[MAXN];
int S[MAXN][MAXC];

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

int search(int a) {
	int st = 0, dr = N, mij;

	while (st != dr) {
		mij = (st + dr + 1) / 2;
		if (Bila[mij].x <= a) st = mij;
		else dr = mij-1;
	}
	return st;
}

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

	assert(scanf("%d %d", &N, &M) == 2);
	assert(1 <= N && N <= 100000);
	assert(1 <= M && M <= 100000);

	for (int i = 1; i <= N; ++i) {
		assert(scanf("%d %d", &Bila[i].x, &Bila[i].y) == 2);
		assert(1 <= Bila[i].y && Bila[i].y <= 64);
	}
	Bila[0].x = -INF;

	sort(Bila+1, Bila+N+1);
	
	for (int i = 1; i <= N; ++i) {
		for (int j = 0; j < MAXC; ++j)
			S[i][j] = S[i-1][j];
		++S[i][Bila[i].y-1];
	}

	for (int i = 0; i < M; ++i) {
		int op, a, b;

		assert(scanf("%d %d %d", &op, &a, &b) == 3);
		
		if (op == 0) {
			int poz = search(a);
			assert(Bila[poz].x == a);

			Bila[poz].x += b;
		}
		else {
			int p1 = search(a);
			int p2 = search(b);

			if (p1 && Bila[p1].x == a) --p1;

			int best = 0;
			for (int j = 0; j < MAXC; ++j)
				best = max(best, S[p2][j] - S[p1][j]);
			printf("%d\n", best);
		}
	}
}