Cod sursa(job #1264631)

Utilizator ccygnusMaygnus Pop ccygnus Data 15 noiembrie 2014 23:17:42
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int nmax = 3500;
int sol,n,aib[nmax+1][nmax+1];
struct cutii
{
    int x,y,z;
}v[nmax+1];
bool cmp(cutii a,cutii b)
{
    return (a.x<b.x);
}
inline int max(int a,int b)
{
    if (a<b)
        return b;
    else
        return a;
}
inline int lsb(int x)
{
    return x&-x;
}
void init()
{
    for(int k=0;k<n;++k)
        for(int i=v[k].y;i<=n;i+=lsb(i))
            for(int j=v[k].z;j<=n;j+=lsb(j))
                aib[i][j]=0;
}
int query(int y,int z)
{
    int ans=0;
    for(int i=y-1;i>0;i-=lsb(i))
        for(int j=z-1;j>0;j-=lsb(j))
            ans=max(ans,aib[i][j]);
    return ans;
}
void update(int y,int z,int val)
{
    for(int i=y;i<=n;i+=lsb(i))
        for(int j=z;j<=n;j+=lsb(j))
            aib[i][j]=max(aib[i][j],val);
}
int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    int t,k;
    scanf("%d%d",&n,&t);
    while(t--)
      {
      for(int i=0;i<n;++i)
          scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
      sort(v,v+n,cmp);
      sol=0;
      for(int i=0;i<n;++i)
          {
          k=query(v[i].y,v[i].z)+1;
          sol=max(sol,k);
          update(v[i].y,v[i].z,k);
          }
      printf("%d\n",sol);
      init();
      }
return 0;
}