Pagini recente » Cod sursa (job #860071) | Cod sursa (job #3267199) | Cod sursa (job #2671554) | Cod sursa (job #1922358) | Cod sursa (job #2800758)
#include <iostream>
#include <algorithm>
#include <cstring>
#define NMAX 3505
using namespace std;
short tests;
int n, fwt[NMAX][NMAX];
pair<int, int> cutii[NMAX];
inline int queryFwt(int X, int Y) {
int ANS = 0;
for(int i = X; i > 0; i -= i & -i)
for(int j = Y; j > 0; j -= j & -j)
ANS = max(ANS, fwt[i][j]);
return ANS;
}
inline void updateFwt(int X, int Y, const int VAL) {
for(int i = X; i <= n; i += i & -i)
for(int j = Y; j <= n; j += j & -j)
fwt[i][j] = max(fwt[i][j], VAL);
}
inline void clearFwt(int X, int Y) {
for(int i = X; i <= n; i += i & -i)
for(int j = Y; j <= n; j += j & -j)
fwt[i][j] = 0;
}
void solve() {
for(int i = 1; i <= n; ++i) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
cutii[z] = {x, y};
}
for(int i = 1; i <= n; ++i) {
const int crt = queryFwt(cutii[i].first, cutii[i].second) + 1;
updateFwt(cutii[i].first, cutii[i].second, crt);
}
printf("%d\n", queryFwt(n, n));
for(int i = 1; i <= n; ++i)
clearFwt(cutii[i].first, cutii[i].second);
}
int main()
{
freopen("cutii.in", "r", stdin);
freopen("cutii.out", "w", stdout);
scanf("%d%hd", &n, &tests);
while(tests--) solve();
return 0;
}