Pagini recente » Borderou de evaluare (job #728632) | Borderou de evaluare (job #1974082) | Borderou de evaluare (job #1846142) | Borderou de evaluare (job #433246) | Cod sursa (job #1231705)
#include <cstdio>
#include <algorithm>
#define putere(x) (x)&(-x)
using namespace std;
struct paralelipiped
{
int x,y,z;
bool operator <(const paralelipiped &aux) const
{
return x<aux.x;
}
}v[3510];
int aib[3505][3505],n,t,i,maxx,s,q,j;
void aib_update(int y,int z,int a)
{
int i,j;
for(i=y;i<=n;i+=putere(i))
for(j=z;j<=n;j+=putere(j))
aib[i][j]=max(aib[i][j],a);
}
int aib_query(int y,int z)
{
int s=0,i,j;
for(i=y;i>0;i-=putere(i))
for(j=z;j>0;j-=putere(j))
s=max(s,aib[i][j]);
return s;
}
int main()
{
freopen("cutii.in", "r", stdin);
freopen("cutii.out", "w", stdout);
scanf("%d%d",&n,&t);
for(;t;t--)
{
for(i=1;i<=n;i++) scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
sort(v+1,v+1+n);
maxx=0;
for(i=1;i<=n;i++)
{
s=aib_query(v[i].y,v[i].z)+1;
aib_update(v[i].y,v[i].z,s);
maxx=max(maxx,s);
}
printf("%d\n",maxx);
for(q=1;q<=n;q++)
for(i=v[q].y;i<=n;i+=putere(i))
for(j=v[q].z;j<=n;j+=putere(j)) aib[i][j]=0;
}
return 0;
}