Cod sursa(job #805536)

Utilizator VincentVegaVincent Vega VincentVega Data 31 octombrie 2012 17:43:58
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define MAXN 3510
using namespace std;

struct mys
{
	int x, y, z;
};
int N, T, sol[MAXN];
mys v[MAXN];
int aib[MAXN][MAXN];

ifstream fin("cutii.in");
ofstream fout("cutii.out");


inline void update(int X, int Y, int val)
{
	for (int i = X; i <= N; i = (i | (i - 1)) + 1)
	{
		for (int j = Y; j <= N; j = (j | (j - 1)) + 1)
		{
			if (aib[i][j] < val)
			{
				aib[i][j] = val;
			}
			else
			if (val == -1)
			{
				aib[i][j] = 0;
			}
		}
	}
}

inline int query(int X, int Y)
{
	int ret = 0;
	for (int i = X - 1; i >= 1; i = i & (i - 1))
	{
		for (int j = Y - 1; j >= 1; j = j & (j - 1))
		{
			if (ret < aib[i][j])
			{
				ret = aib[i][j];
			}
		}
	}
	
	return ret;
}

struct cmp
{
	bool operator()(const mys &a, const mys &b) const
	{
		return a.z < b.z;
	}
};

int solve()
{
	int ret = 0;
	
	for (int i = 1; i <= N; ++i)
	{
		fin >> v[i].x >> v[i].y >> v[i].z;
		sol[i] = 0;
	}
	
	sort(v + 1, v + N + 1, cmp());
	
	
	for (int i = 1; i <= N; ++i)
	{
		int val = query(v[i].x, v[i].y);
		update(v[i].x, v[i].y, val + 1);
		if (ret < val + 1) ret = val + 1;
	}
	for (int i = 1; i <= N; ++i)
	{
		update(v[i].x, v[i].y, -1);
	}
	
	return ret;
}



int main()
{	
	fin >> N >> T;
	
	for (; T; T--)
	{
		fout << solve() << '\n';
	}
}