Cod sursa(job #3294249)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 20 aprilie 2025 13:27:13
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
//
//#pragma GCC optimize ("Ofast")
//#pragma GCC optimize ("fast-math")
//#pragma GCC optimize ("unroll-loops")
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;

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

const int NRMAX = 3501;

template <typename T1, typename T2, typename T3>
struct elemente
{
	T1 x;
	T2 y;
	T3 z;
};
elemente<int, int, int> v[NRMAX];
int a[NRMAX][NRMAX], d[NRMAX], n;

void update(int p, int q, int val)
{
	int i, j;

	for (i = p; i <= n; i += (i & -i))
	{
		for (j = q; j <= n; j += (j & -j))
		{
			//cout << i << " " << j << " ";
			a[i][j] = max(a[i][j], val);
		}
	}
}
int cautare(int p, int q)
{
	int i, j, maxi = 0;

	for (i = p; i >= 1; i -= (i & -i))
	{
		for (j = q; j >= 1; j -= (j & -j))
		{
			maxi = max(maxi, a[i][j]);
		}
	}

	return  maxi;
}

bool comparare(elemente<int, int, int>  a, elemente<int, int, int>  b)
{
	return a.x < b.x;
}

int main()
{
	ios_base::sync_with_stdio(false);
	//cin.tie(NULL);

	int i, j, k, ii, t, r;

	fin >> n >> t;
	for (k = 1; k <= t; ++k)
	{
		r = 0;
		memset(a, 0, sizeof(a));
		memset(d, 0, sizeof(d));

		for (i = 1; i <= n; ++i)
		{
			fin >> v[i].x >> v[i].y >> v[i].z;
		}

		sort(v + 1, v + n + 1, comparare);

		//cout << "a";
		ii = 0;
		for (i = 1; i <= n; ++i)
		{
			//cout << i << " " << ii << "\n";
			//cout << v[i].x << " " << v[i].y << " " << v[i].z << "\n";
			if ((ii != 0) && (v[i].x != v[i - 1].x))
			{
				for (j = ii; j < i; ++j)
				{
					//cout << j << " ";
					update(v[j].y, v[j].z, d[j]);
				}
			}
			ii = i;

			//cout << "b";
			
			//cout << cautare(v[i].y - 1, v[i].z - 1) << "\n";
			d[i] = 1 + cautare(v[i].y - 1, v[i].z - 1);
			//cout << d[i] << "\n";
			r = max(r, d[i]);
		}

		/*for (i = 1; i <= n; ++i)
		{
			cout << d[i] << " ";
		}*/
		//cout << "\n";
		//cout << "c";

		fout << r << "\n";
	}

	return 0;
}