Pagini recente » Cod sursa (job #2279480) | Cod sursa (job #1885188) | Cod sursa (job #2983406) | Cod sursa (job #741538) | Cod sursa (job #1987847)
#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);
}
inline void clear(){
for(int i = 1; i <= n ; ++i)
for(int x = a[i].x; x <= n ; x += (x & (-x)))
for(int y = a[i].y; y <= n ; y += (y & (-y)))
aib[x][y] = 0;
}
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);
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;
}
clear();
printf("%d\n", Sol);
}
return 0;
}