Pagini recente » Monitorul de evaluare | Statistici Zoitanu (Adryana) | Monitorul de evaluare | Istoria paginii runda/pregatire_vianu | Cod sursa (job #2012914)
#include <cstdio>
#include <algorithm>
using namespace std;
const int nmax=3502;
int n;
int aib[nmax][nmax];
struct str
{
int x;
int y;
int z;
bool operator <(const str &aux) const
{
if(x!=aux.x) return x<aux.x;
if(y!=aux.y) return y<aux.y;
return z<aux.z;
}
}v[nmax];
void citire()
{
for(int i=1;i<=n;i++) scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
sort(v+1,v+n+1);
}
void update(int p1,int p2,int val)
{
for(int i=p1;i<=n;i+=(p1&(-p1)))
{
for(int j=p2;j<=n;j+=(p2&(-p2))) aib[i][j]=max(aib[i][j],val);
}
}
int query(int p1,int p2)
{
int ans=0;
for(int i=p1;i>0;i-=(i&(-i)))
{
for(int j=p2;j>0;j-=(j&(-j))) ans=max(ans,aib[i][j]);
}
return ans;
}
void solve()
{
int maxans=0;
for(int i=1;i<=n;i++)
{
int ans=query(v[i].y-1,v[i].z-1);
ans++;
maxans=max(maxans,ans);
if(v[i].x!=v[i+1].x)
{
for(int j=i;v[j].x==v[i].x;--j) update(v[j].y,v[j].z,ans);
}
}
printf("%d\n",maxans);
}
void clear_aib()
{
for(int i=1;i<=n;i++)
{
for(int j=v[i].y;j<=n;j+=(j&(-j)))
{
for(int k=v[i].z;k<=n;k+=(k&(-k))) aib[j][k]=0;
}
}
}
int main()
{
freopen ("cutii.in","r",stdin);
freopen ("cutii.out","w",stdout);
int t;
scanf("%d%d",&n,&t);
for(;t>0;--t)
{
citire();
solve();
clear_aib();
}
}