Cod sursa(job #475578)

Utilizator darrenRares Buhai darren Data 7 august 2010 15:45:18
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <algorithm>
#include <utility>

using namespace std;

int n, m;
pair<int, int> v[100001];
int s[100001][65];

int main()
{
	ifstream fin("marbles.in");
	ofstream fout("marbles.out");

	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
		fin >> v[i].first >> v[i].second;
	sort(v + 1, v + n + 1);
	for (int i = 1; i <= n; ++i)
	{
		++s[i][v[i].second];
		for (int j = 1; j <= 64; ++j)
			s[i][j] += s[i - 1][j];
	}

	int aux, p1, p2;
	for (int i = 1; i <= m; ++i)
	{
		fin >> aux >> p1 >> p2;

		int step, pos1, pos2;

		switch (aux)
		{
			case 0:
				for (step = 1; (step << 1) <= n; step <<= 1);
				for (pos1 = 0; step; step >>= 1)
					if (pos1 + step <= n && v[pos1 + step].first <= p1)
						pos1 += step;
				v[pos1].first += p2;
				break;
			case 1:
				for (step = 1; (step << 1) <= n; step <<= 1);
				for (pos1 = 0; step; step >>= 1)
					if (pos1 + step <= n && v[pos1 + step].first < p1)
						pos1 += step;

				for (step = 1; (step << 1) <= n; step <<= 1);
				for (pos2 = 0; step; step >>= 1)
					if (pos2 + step <= n && v[pos2 + step].first <= p2)
						pos2 += step;
				int mxm = 0;
				for (int j = 1; j <= 64; ++j)
					mxm = max(mxm, s[pos2][j] - s[pos1][j]);
				fout << mxm << '\n';
				break;
		}
	}


	fin.close();
	fout.close();
}