Pagini recente » Monitorul de evaluare | Cod sursa (job #336329) | Cod sursa (job #19079) | Cod sursa (job #1166945) | Cod sursa (job #1171471)
# include <algorithm>
# include <cstdio>
# include <cmath>
using namespace std;
struct cut {
int X, Y, Z;
} A[3505];
int best[3505], aib[3505][3505];
int N, T;
const bool operator < (const cut &a, const cut &b) {
return a.X < b.X;
}
inline void getmax (int &a, int b) {
a = a > b ? a : b;
}
void update(int y, int z, int val) {
for (int i = y; i <= N; i += i & -i)
for (int j = z; j <= N; j += j & -j)
getmax(aib[i][j], val);
}
inline int query (int y, int z) {
int sol = 0;
for (int i = y - 1; i > 0; i -= i & -i)
for (int j = z - 1; j > 0; j -= j & -j)
getmax(sol, aib[i][j]);
return sol;
}
inline void reset (int y, int z) {
for (int i = y; i <= N; i += i & -i)
for (int j = z; j <= N; j += j & -j)
aib[i][j] = 0;
}
int main (void) {
freopen ("cutii.in", "r", stdin);
freopen ("cutii.out", "w", stdout);
for (scanf ("%d %d", &N, &T); T; --T) {
for (int i = 1; i <= N; ++i) {
scanf ("%d %d %d", &A[i].X, &A[i].Y, &A[i].Z);
}
sort (A + 1, A + N + 1);
int sol = 0;
for (int i = 1; i <= N; ++i) {
const int value = query(A[i].Y, A[i].Z);
getmax(sol, value + 1);
update(A[i].Y, A[i].Z, value + 1);
}
for (int i = 1; i <= N; ++i)
reset(A[i].Y, A[i].Z);
printf ("%d\n", sol);
}
return 0;
}