Cod sursa(job #1427429)

Utilizator delia_99Delia Draghici delia_99 Data 2 mai 2015 11:27:53
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>
#define ub(x) (x&(-x))
using namespace std;
struct awesome
{
    int x,y,z;
};
int n,t,i,j,val,AIB[3505][3505],p1,p2;
awesome v[3505];

inline bool cmp(awesome a,awesome b)
{
    if(a.x<b.x)  return true;
    if(a.x==b.x && a.y<b.y)  return true;
    if(a.x==b.x && a.y==b.y && a.z<b.z) return true;
    return false;
}

inline void upd(int xx,int yy,int val)
{
    int i,j;
    for(i=xx; i<=n; i+=ub(i))
        for(j=yy; j<=n; j+=ub(j))
            AIB[i][j]=max(AIB[i][j],val);
}

inline int query(int xx,int yy)
{
    int i,j,nr=0;
    for(i=xx;i>0;i-=ub(i))
        for(j=yy;j>0;j-=ub(j))
          nr=max(nr,AIB[i][j]);
    return nr;
}

inline void cl(int xx,int yy)
{
    int i,j;
    for(i=xx; i<=n; i+=ub(i))
        for(j=yy; j<=n; j+=ub(j))
            AIB[i][j]=0;
}
int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    scanf("%d %d\n",&n,&t);
    for(i=1; i<=t; ++i)
    {
        for(j=1; j<=n; ++j)
            scanf("%d %d %d\n",&v[j].x,&v[j].y,&v[j].z);
        sort(v+1,v+n+1,cmp);

        for(j=1; j<=n; ++j)
        {
            p1=v[j].y;
            p2=v[j].z;
            val=query(p1-1,p2-1)+1;
            upd(p1,p2,val);
        }
        printf("%d\n",query(n,n));
        for(j=1;j<=n;++j)
            cl(v[j].y,v[j].z);
    }
    return 0;
}