Cod sursa(job #1670074)

Utilizator krityxAdrian Buzea krityx Data 31 martie 2016 13:45:10
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

class BIT
{
	vector<vector<int>> _container;

public:
	int idx(int i)
	{
		return (i ^ (i - 1)) & i;
	}
	BIT(int n, int m)
	{
		_container.resize(n + 1);
		for (int i = 0; i < _container.size(); i++)
		{
			_container[i].resize(m + 1);
		}
	}
	void Clear()
	{
		for (int i = 0; i < _container.size(); i++)
		{
			fill(_container[i].begin(), _container[i].end(), 0);
		}
	}
	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;
	}
};

inline bool cmp(const Box& b1, const Box& b2)
{
	return b1.x < b2.x;
}

int main()
{
	int T, i, j, a, b, c, N;
	vector<Box> boxes;
	//ifstream f("cutii.in");
	//ofstream g("cutii.out");
	FILE *f = fopen("cutii.in", "r");
	FILE *g = fopen("cutii.out", "w");


	fscanf(f, "%d%d", &N, &T);
	boxes.resize(N + 1);
	BIT bit(N, N);
	for (; T > 0; T--)
	{
		bit.Clear();
		for (i = 1; i <= N; i++)
		{
			//f >> a >> b >> c;
			fscanf(f, "%d%d%d", &boxes[i].x, &boxes[i].y, &boxes[i].z);
			//boxes[i].x = a;
			//boxes[i].y = b;
			//boxes[i].z = 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);
		}
		fprintf(g, "%d\n", bit.Query(N, N));
		
	}
	return 0;
}