Cod sursa(job #1661916)

Utilizator krityxAdrian Buzea krityx Data 24 martie 2016 12:01:54
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

class BIT
{
	vector<vector<int>> _container;
	int idx(int i)
	{
		return (i ^ (i - 1)) & i;
	}
public:
	BIT(int n, int m)
	{
		_container.resize(n + 1);
		for (int i = 1; i <= n; i++)
		{
			_container[i].resize(m + 1);
		}
	}
	void Update(int a, int b, int value)
	{
		for (int i = a; i <= _container.size() - 1; i+=idx(i))
		{
			for (int j = b; j <= _container[i].size() - 1; j += idx(j))
			{
				_container[i][j] = max(_container[i][j], value);
			}
		}
	}
	int Query(int a, int b)
	{
		int result = 0;
		for (int i = a; i > 0; i -= idx(i))
		{
			for (int j = b; j > 0; j -= idx(j))
			{
				if (_container[i][j] > result)
				{
					result = _container[i][j];
				}
			}
		}
		return result;
	}
};

class Box
{
public:
	int x, y, z;
	Box(){ }
	Box(int a, int b, int c)
	{
		x = a;
		y = b;
		z = c;
	}
	bool operator<(Box& other)
	{
		return x > other.x;
	}
};

int main()
{
	int N, T, i, j, a, b, c;
	vector<Box> boxes;
	vector<int> best;
	ifstream f("cutii.in");
	ofstream g("cutii.out");
	f >> N >> T;
	best.resize(N + 1);
	for (; T > 0; T--)
	{
		fill(best.begin(), best.end(), 0);
		boxes.clear();
		for (i = 1; i <= N; i++)
		{
			f >> a >> b >> c;
			boxes.push_back(Box(a, b, c));
		}
		sort(boxes.begin(), boxes.end());
		best[1] = 1;
		BIT bit(N, N);
		bit.Update(boxes[0].y, boxes[0].z, 1);
		for (j = 2; j <= N; j++)
		{
			best[j] = bit.Query(boxes[j-1].y + 1, boxes[j-1].z + 1) + 1;
			bit.Update(boxes[j - 1].y, boxes[j - 1].z, best[j]);
		}
		g << best[N] << "\n";
		
	}
	f.close();
	g.close();
	return 0;
}