Cod sursa(job #442368)
#include <stdio.h>
#include <algorithm>
#define NMAX 3505
#define si short int
using namespace std;
struct cutie
{
int x,y,z;
};
cutie A[NMAX];
int t,n,best[NMAX],rez_f;
si aib[NMAX][NMAX];
void read()
{
int i;
for (i=1; i<=n; i++)
scanf("%d%d%d",&A[i].x,&A[i].y,&A[i].z);
}
bool comp(cutie a,cutie b)
{
return a.x<b.x;
}
void init()
{
int i,j;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
aib[i][j]=0;
rez_f=0;
}
int lsb(int x)
{
return x & -x;
}
inline int max(int x,int y)
{
return x>y ? x : y;
}
int query(int st,int dr)
{
int i,j,rez=0;
for (i=st; i>0; i-=lsb(i))
for (j=dr; j>0; j-=lsb(j))
rez=max(rez,aib[i][j]);
return rez;
}
void update2(int st,int dr,int val)
{
int i,j;
for (i=st; i<=n; i+=lsb(i))
for (j=dr; j<=n; j+=lsb(j))
aib[i][j]=max(aib[i][j],val);
}
void update(int ind1,int ind2)
{
if (ind1==0)
return ;
int i;
for (i=ind1; i<=ind2; i++)
update2(A[i].y,A[i].z,best[i]);
}
void solve()
{
int i,p1=0,p2=0;
for (i=1; i<=n; i++)
{
if (A[i].x!=A[i-1].x)
{
update(p1,p2);
p1=i;
}
p2=i;
best[i]=query(A[i].y-1,A[i].z-1)+1;
if (best[i]>rez_f)
rez_f=best[i];
}
}
int main()
{
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
scanf("%d%d",&n,&t);
while (t--)
{
read();
sort(A+1,A+n+1,comp);
init();
solve();
printf("%d\n",rez_f);
}
return 0;
}