Pagini recente » Cod sursa (job #2690545) | Cod sursa (job #218327) | Cod sursa (job #1112924) | Cod sursa (job #1835476) | Cod sursa (job #810158)
Cod sursa(job #810158)
#include <cstdio>
const int MAX_SIZE(3501);
int n;
int boxes [MAX_SIZE] [2];
int bit [MAX_SIZE] [MAX_SIZE];
inline void read (void)
{
int x, y, z;
for (int i(1) ; i <= n ; ++i)
{
std::scanf("%d%d%d",&x,&y,&z);
boxes[x][0] = y;
boxes[x][1] = z;
}
}
inline int lsb (int x)
{
return x & -x;
}
inline int query (int x, int y)
{
int i, j, max(0);
for (i = x ; i ; i -= lsb(i))
for (j = y ; j ; j-= lsb(j))
if (bit[i][j] > max)
max = bit[i][j];
return max;
}
inline void update (int x, int y, int length)
{
int i, j;
for (i = x ; i <= n ; i += lsb(i))
for (j = y ; j <= n ; j += lsb(x))
if (length > bit[i][j])
bit[i][j] = length;
}
inline int maximum_incresing_substring (void)
{
int max(0), length;
for (int i(1) ; i <= n ; ++i)
{
length = query(boxes[i][0] - 1,boxes[i][1] - 1) + 1;
update(boxes[i][0],boxes[i][1],length);
if (length > max)
max = length;
}
return max;
}
inline void clear_tree (void)
{
int x, y, z;
for (x = 1 ; x <= n ; ++x)
for (y = boxes[x][0] ; y <= n ; y += lsb(y))
for (z = boxes[x][1] ; z <= n ; z += lsb(z))
bit[y][z] = 0;
}
int main (void)
{
std::freopen("cutii.in","r",stdin);
std::freopen("cutii.out","w",stdout);
int t;
std::scanf("%d%d",&n,&t);
while (true)
{
read();
std::printf("%d\n",maximum_incresing_substring());
--t;
if (t)
clear_tree();
else
break;
}
std::fclose(stdin);
std::fclose(stdout);
return 0;
}