Cod sursa(job #1236243)

Utilizator horatiu11Ilie Ovidiu Horatiu horatiu11 Data 1 octombrie 2014 18:27:16
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
//horatiu11
# include <cstdio>
# include <vector>
# include <cstring>
# define LSB(x) (-x)&x
# define nmax 3501
using namespace std;
int AIB[nmax][nmax],n,t,Max,sol,x,y,z;
pair <int,int>a[nmax];
inline int max(int a, int b)
{
    if(a>b)return a;
    return b;
}
inline void reinit()
{
    int x,y,z;
    sol=0;
    for(z=1;z<=n;++z)
        for(x=a[z].first;x<=n;x+=LSB(x))
            for(y=a[z].second;y<=n;y+=LSB(y))
                AIB[x][y]=0;
}
inline void update(int a, int b, int val)
{
    int i,j;
    for(i=a;i<=n;i+=LSB(i))
        for(j=b;j<=n;j+=LSB(j))
            AIB[i][j]=max(AIB[i][j],val);
}
inline int query(int a, int b)
{
    int i,j,Max;
    for(i=a;i>0;i-=LSB(i))
        for(j=b;j>0;j-=LSB(j))
            Max=max(Max,AIB[i][j]);
    return Max;
}
int main()
{
    int i;
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    scanf("%d%d",&n,&t);
    while(t)
    {
        for(i=1;i<=n;++i)
        {
            scanf("%d%d%d",&x,&y,&z);
            a[z]=make_pair(x,y);
        }
        for(i=1;i<=n;++i)
        {
            Max=query(a[i].first-1,a[i].second-1);
            update(a[i].first,a[i].second,Max+1);
            sol=max(sol,Max+1);
        }
        printf("%d\n",sol);
        reinit();
        --t;
    }
    return 0;
}