Cod sursa(job #771548)

Utilizator SteveStefan Eniceicu Steve Data 26 iulie 2012 12:59:26
Problema Marbles Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef struct {
	int coord;
	int culoare;
	int x[65];
} lol;

int N, M;
lol v[100005];
ifstream fin ("marbles.in");

inline int cmp (lol a, lol b) {
	return (a.coord < b.coord);
}

void Citire () {
	fin >> N >> M;
	for (int i = 0; i < N; i++)
	{
		fin >> v[i].coord >> v[i].culoare;
	}
	sort (v, v + N, cmp);
	v[0].x[v[0].culoare] = 1;
	for (int i = 1; i < N; i++)
	{
		memcpy (v[i].x, v[i - 1].x, sizeof (v[i - 1].x));
		v[i].x[v[i].culoare]++;
	}
}

int B_Search (int val) {
	int i, step = 1 << 20;
	for (i = 0; step; step >>= 1)
		if (i + step < N && v[i + step].coord <= val) i += step;
	return i;
}

void Business () {
	ofstream fout ("marbles.out");
	int a, b, c, dog, dog2, mare;
	for (int i = 0; i < M; i++)
	{
		fin >> a >> b >> c;
		if (a)
		{
			mare = 0;
			dog = B_Search (b);
			if (v[dog].coord < b) dog++;
			dog2 = B_Search (c);
			for (int u = 1; u <= 64; u++)
			{
				mare = max (mare, v[dog2].x[u] - v[dog - 1].x[u]);
			}
			fout << mare << "\n";
		}
		else
		{
			dog = B_Search (b);
			v[dog].coord += c;
		}
	}
	fin.close ();
	fout.close ();
}

int main () {
	Citire ();
	Business ();
	return 0;
}