Pagini recente » Istoria paginii utilizator/atpkekw | Monitorul de evaluare | Istoria paginii utilizator/floribun | Monitorul de evaluare | Cod sursa (job #1987844)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, t, aib[3505][3505];
struct cutie{
int x, y, z;
}a[3502];
inline bool cmp(cutie a, cutie b){
return a.z < b.z;
}
inline int query(int x, int y){
int ans = 0;
for(int i = x; i >= 1 ; i -= (i & (-i)))
for(int j = y; j >= 1 ; j -= (j & (-j)))
ans = max(ans, aib[i][j]);
return ans;
}
inline void update(int x, int y, int val){
for(int i = x; i <= n ; i += (i & (-i)))
for(int j = y; j <= n ; j += (j & (-j)))
aib[i][j] = max(aib[i][j], val);
}
int main()
{
freopen("cutii.in", "r", stdin);
freopen("cutii.out", "w", stdout);
scanf("%d%d", &n, &t);
while(t--){
for(int i = 1; i <= n ; ++i)
scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);
memset(aib, 0, sizeof(aib));
sort(a + 1, a + n + 1, cmp);
int Sol = 0;
for(int i = 1; i <= n ; ++i){
int bst = query(a[i].x, a[i].y) + 1;
update(a[i].x, a[i].y, bst);
if(bst > Sol) Sol = bst;
}
printf("%d\n", Sol);
}
return 0;
}