Cod sursa(job #1667139)

Utilizator SilviuIIon Silviu SilviuI Data 28 martie 2016 17:58:39
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <cstring>
#include <algorithm>
#define nmax 3510

using namespace std;

struct date { int x,y,z; };

int n,m;
short int dp[nmax][nmax];
date t[nmax];

bool cmp(const date &a,const date &b)
{
    if (a.x==b.x) return a.y*a.z<b.y*b.z; else
       return a.x<b.x;
}

inline int lsb(int x)
{
    return x&(-x);
}

short int query(int x,int y)
{
    short int sol=0;
    for (int i=x;i>0;i-=lsb(i))
        for (int j=y;j>0;j-=lsb(j))
            sol=max(sol,dp[i][j]);

    return sol;
}

void update(int x,int y,short int val)
{
    for (int i=x;i<=n;i+=lsb(i))
        for (int j=y;j<=n;j+=lsb(j))
            dp[i][j]=max(dp[i][j],val);
}

int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);

    scanf("%d %d",&n,&m);

    for (int o=1;o<=m;o++) {

        for (int i=1;i<=n;i++) scanf("%d %d %d",&t[i].x,&t[i].y,&t[i].z);

        memset(dp,0,sizeof(dp));

        sort(t+1,t+n+1,cmp);

        for (int i=1;i<=n;i++) {
            int l=query(t[i].y,t[i].z);

            update(t[i].y,t[i].z,l+1);

        }

        printf("%d\n",query(n,n));

    }

    return 0;
}