Cod sursa(job #2333199)

Utilizator DajaMihaiDaja Mihai DajaMihai Data 31 ianuarie 2019 19:28:28
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb

#include <bits/stdc++.h>

using namespace std;

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

struct Box
{
	int x, y, z;
};

bool cmp(Box a, Box b)
{
	return a.x < b.x;
}

const int DIM = 3507;

Box v[DIM];
int best[DIM];
int aib[DIM][DIM];

int n;

void update(int y, int z, int val)
{
	int i, j;
	for(i = y; i <= n; i += (i & -i))
		for(j = z; j <= n; j += (j & -j))
			aib[i][j] = max(aib[i][j], val);
}

int query(int y, int z)
{
	int mx = 0;
	int i, j;
	for(i = y; i > 0; i -= (i & -i))
		for(j = z; j > 0; j -= (j & -j))
			mx = max(mx, aib[i][j]);

	return mx;
}

void reset(int y, int z)
{
	int i, j;

	for(i = y; i <= n; i += (i & (-i)))
		for(j = z; j <= n; j += (j & -j))
			aib[i][j] = 0;
}

int t;
int mx;

int main()
{
	in >> n >> t;

	while(t--)
	{
		int i;
		for(i = 1; i <= n; i++)
			in >> v[i].x >> v[i].y >> v[i].z;

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

		mx = 0;

		for(i = 1; i <= n; i++)
		{
			best[i] = query(v[i].y, v[i].z) + 1;
			mx = max(mx, best[i]);
			update(v[i].y, v[i].z, best[i]);
		}

		out << mx << '\n';
		for(int i = 1; i <= n; i++)
			reset(v[i].y, v[i].z);
	}
}