Pagini recente » Cod sursa (job #2823137) | Cod sursa (job #2157923) | Cod sursa (job #2866138) | Cod sursa (job #321868) | Cod sursa (job #288035)
Cod sursa(job #288035)
#include <cstdio>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;
struct nod
{
short x, y, z;
};
struct cmp{
bool operator()(const nod &a, const nod &b)const
{
if(a.x < b.x) return 1;
return 0;
}
};
nod a[3501];
short dp[3501];
int n, T;
short aib[3501][3501];
inline void update(short x,short y, short v)
{
for(int i=x+1; i <= n+1; i += (i & ((i-1)^i)))
for(int j=y+1; j <= n+1; j += (j & ((j-1)^j)))
aib[i][j] = max(aib[i][j], v);
}
inline void update2(short x, short y, short v)
{
for(int i=x+1; i <= n+1; i += (i & ((i-1)^i)))
for(int j=y+1; j <= n+1; j += (j & ((j-1)^j)))
aib[i][j]=v;
}
inline int query(short x, short y)
{
short v=0;
for(int i=x+1; i ; i -= (i & ((i-1)^i)))
for(int j=y+1; j ; j -= (j & ((j-1)^j)))
{
// printf("_%d\n",aib[i][j]);
v=max(v, aib[i][j]);
}
return v;
}
void solve()
{
int i, j;
for(i=0; i <= n; ++i) dp[i]=0;
// memset(aib, 0,sizeof(aib));
//update(0, 0, 0);
int mx=1;
dp[1]=1;
/*
for(i=2 ;i <= n; ++i)
{
dp[i]=1;
for(j=i-1; j ; --j)
if(a[i].y > a[j].y && a[i].z > a[j].z)
if(dp[j]+1 > dp[i]) dp[i]=dp[j]+1;
if(dp[i] > mx) mx=dp[i];
}
*/
update(a[1].x, a[1].y,1);
for(i=2; i <= n;++i)
{
dp[i] = 1 + query(a[i].y-1, a[i].z-1);
update(a[i].y, a[i].z, dp[i]);
if(dp[i] > mx) mx=dp[i];
}
for(i=1; i <= n; ++i) update2(a[i].x, a[i].y, 0);
printf("%d\n",mx);
}
int main()
{
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
scanf("%d %d\n", &n, &T);
//memset(aib, 0, sizeof(aib));
int i;
while(T--)
{
for(i=1;i <= n; ++i) scanf("%d %d %d\n", &a[i].x, &a[i].y, &a[i].z);
sort(a+1,a+n+1,cmp());
solve();
}
return 0;
}