Pagini recente » Cod sursa (job #2956309) | Cod sursa (job #2167803) | Cod sursa (job #1199158) | Cod sursa (job #2656948) | Cod sursa (job #1418140)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMax 3505
using namespace std;
int AIB[NMax][NMax],N,T,Max;
struct Cutie
{
int x,y,z;
}A[NMax];
int Bit(int x)
{
return x&(-x);
}
void Curata(int x,int y)
{
for(int i=x;i<=N;i+=Bit(i))
for(int j=y;j<=N && AIB[i][j]!=0;j+=Bit(i))
AIB[i][j]=0;
}
void Update(int x,int y,int valoare)
{
for(int i=x;i<=N;i+=Bit(i))
for(int j=y;j<=N && AIB[i][j]<valoare;j+=Bit(j))
AIB[i][j]=valoare;
}
int Query(int x,int y)
{
int Max=0;
for(int i=x;i>0;i-=Bit(i))
for(int j=y;j>0;j-=Bit(i))
if(Max<AIB[i][j])
Max=AIB[i][j];
return Max;
}
bool comp(Cutie A,Cutie B)
{
return (A.x < B.x || (A.x == B.x && A.y < B.y) || (A.x == B.x && A.y == B.y && A.z < B.z));
}
int main()
{
freopen ("cutii.in","r",stdin);
freopen ("cutii.out","w",stdout);
int rez,Max=0;
//g>>N>>T;
scanf ("%d%d",&N,&T);
for(int k=1;k<=T;k++)
{
for(int i=1;i<=N;i++)
//g>>A[i].x>>A[i].y>>A[i].z;
scanf ("%d%d%d",&A[i].x,&A[i].y,&A[i].z);
sort(A+1,A+N+1,comp);
Max=0;
for(int i=1;i<=N;i++)
{
rez=Query(A[i].y-1,A[i].z-1)+1;
if(Max<rez)
Max=rez;
Update(A[i].y,A[i].z,rez);
}
//cout<<Max<<endl;
printf ("%d\n",Max);
for(int i=1;i<=N;i++)
Curata(A[i].y,A[i].z);
}
}