Cod sursa(job #1668905)

Utilizator krityxAdrian Buzea krityx Data 30 martie 2016 10:16:28
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

int _container[3501][3501], N;

class BIT
{
	int idx(int i)
	{
		return (i ^ (i - 1)) & i;
	}
public:
	BIT()
	{
	}
	void Clear()
	{
		memset(_container, 0, sizeof(_container));
	}
	void Update(int a, int b, int value)
	{
		for (int i = a; i <= N; i+=idx(i))
		{
			for (int j = b; j <= N; 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 cmp(const Box& b1, const Box& b2)
{
	return b1.x < b2.x;
}

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