Cod sursa(job #1670062)

Utilizator krityxAdrian Buzea krityx Data 31 martie 2016 13:36:51
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <cstdio>
#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;
	Box boxes[3501];
	//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);
	BIT bit;
	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(begin(boxes) + 1, begin(boxes) + N + 1, 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;
}