Cod sursa(job #1691733)

Utilizator marioviperconstantin mario marioviper Data 19 aprilie 2016 12:09:47
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 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;
}