Cod sursa(job #2332118)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 30 ianuarie 2019 13:37:20
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 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);
	}
}