Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/ikogames | Profil Gl0W | Monitorul de evaluare | Cod sursa (job #3706)
Cod sursa(job #3706)
#include <cstdio>
#include <memory>
using namespace std;
const char iname[] = "cutii.in";
const char oname[] = "cutii.out";
#define MAX_N 3501
#define ultbit(x) ((x) & ((x) ^ (x-1)))
int N, T;
int x[MAX_N], y[MAX_N], z[MAX_N];
int A[MAX_N][MAX_N];
int X[MAX_N];
void update(int x, int y, int best)
{
for (int i = x; i <= N; i += ultbit(i))
for (int j = y; j <= N; j += ultbit(j)) {
if (best == 0)
A[i][j] = best;
else if (A[i][j] < best)
A[i][j] = best;
}
}
int query(int x, int y)
{
int m = 0;
for (int i = x; i; i -= ultbit(i))
for (int j = y; j; j -= ultbit(j))
if (m < A[i][j]) m = A[i][j];
return m;
}
void sort(void)
{
int cnt[MAX_N];
int i;
memset(cnt, 0, sizeof(cnt));
for (i = 1; i <= N; ++i)
++cnt[ z[i] ];
for (i = 2; i <= N; ++i)
cnt[i] += cnt[i - 1];
for (i = N; i; --i)
X[ cnt[ z[i] ]-- ] = i;
}
int main(void)
{
int i;
int best, temp;
freopen(iname, "r", stdin);
freopen(oname, "w", stdout);
scanf("%d %d\n", &N, &T);
for (; T--;) {
for (i = 1; i <= N; ++i)
scanf("%d %d %d\n", x+i, y+i, z+i);
sort();
for (best = 0, i = 1; i <= N; ++i) {
temp = query(x[ X[i] ] - 1, y[ X[i] ] - 1) + 1;
update(x[ X[i] ], y[ X[i] ], temp);
if (best < temp)
best = temp;
}
printf("%d\n", best);
for (i = 1; i <= N; ++i)
update(x[ X[i] ], y[ X[i] ], 0);
}
return 0;
}