Cod sursa(job #1558278)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 28 decembrie 2015 22:57:13
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

const int MN = 3504;

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

int n,t;
int dp[MN];
int bit[MN][MN];
item ar[MN];

bool comp(item a,item b)
{
    return a.x < b.x;
}

void update(int a,int b,int val)
{
    for (int i = a;i <= n;i += i & (-i))
        for (int j = b;j <= n;j += j & (-j))
            bit[i][j] = max(bit[i][j],val);
}

int query(int a,int b)
{
    int sol = 0;

    for (int i = a;i;i -= i & (-i))
        for (int j = b;j;j -= j & (-j))
            sol = max(sol,bit[i][j]);

    return sol;
}

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

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

     while (t--)
     {
         int sol = 0;
         memset(bit,0,sizeof(bit));

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

         sort(ar + 1,ar + 1 + n,comp);

         for (int i = 1;i <= n;i++)
         {
             dp[i] = query(ar[i].y - 1,ar[i].z - 1) + 1;
             update(ar[i].y,ar[i].z,dp[i]);
             sol = max(sol,dp[i]);
         }

         printf("%d\n",sol);
     }

  return 0;
}