Cod sursa(job #771556)

Utilizator SteveStefan Eniceicu Steve Data 26 iulie 2012 13:15:29
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

typedef struct {
	int coord;
	int culoare;
} lol;

int N, M;
lol v[100005];
int sol[100005][65];
char pars[50];

ifstream fin ("marbles.in");

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

void Citire () {
	fin >> N >> M;
	int u, pff;
	fin.getline (pars, 10);
	for (int i = 0; i < N; i++)
	{
		fin.getline (pars, 48);
		u = 0;
		pff = 1;
		if (pars[0] == '-') u++, pff = -1;
		for (; pars[u] >= '0' && pars[u] <= '9'; u++)
		{
			v[i].coord = v[i].coord * 10 + pff * (pars[u] - '0');
		}
		u++;
		for (; pars[u] >= '0' && pars[u] <= '9'; u++)
		{
			v[i].culoare = v[i].culoare * 10 + pars[u] - '0';
		}
	}
	sort (v, v + N, cmp);
	sol[0][v[0].culoare] = 1;
	for (int i = 1; i < N; i++)
	{
		memcpy (sol[i], sol[i - 1], sizeof (sol[i - 1]));
		sol[i][v[i].culoare]++;
	}
}

inline 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, y, pff;
	for (int i = 0; i < M; i++)
	{
		fin.getline (pars, 40);
		
		a = pars[0] - '0';
		b = 0;
		c = 0;
		pff = 1;
		y = 2;
		if (pars[2] == '-') pff = -1, y++;
		
		for (; pars[y] >= '0' && pars[y] <= '9'; y++)
			b = b * 10 + pff * (pars[y] - '0');
		
		y++;
		pff = 1;
		if (pars[y] == '-') pff = -1, y++;
		for (; pars[y] >= '0' && pars[y] <= '9'; y++)
			c = c * 10 + pff * (pars[y] - '0');
		
		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, sol[dog2][u] - sol[dog - 1][u]);
			}
			fout << mare << "\n";
		}
		else
		{
			dog = B_Search (b);
			v[dog].coord += c;
		}
	}
	fin.close ();
	fout.close ();
}

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