Cod sursa(job #1197579)

Utilizator andrettiAndretti Naiden andretti Data 12 iunie 2014 19:50:12
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<algorithm>
#define maxn 3505
using namespace std;

struct box{int x,y,z;} a[maxn];
int T,n,sol;
int best[maxn],aib[maxn][maxn];

bool cmp(const box &a,const box &b){
    return a.x<b.x;
}

void change(int &x,int val,int ok){
    if(ok) x=max(x,val);
    else x=0;
}

void update(int x,int y,int val,int ok)
{
    int yc;
    for(;x<=n;x+=x&(-x))
     for(yc=y;yc<=n;yc+=yc&(-yc))
      change(aib[x][yc],val,ok);
}

int query(int x,int y)
{
    int Max=0,yc;
    for(;x;x-=x&(-x))
     for(yc=y;yc;yc-=yc&(-yc))
      Max=max(Max,aib[x][yc]);
    return Max;
}

void solve()
{
    sort(a+1,a+n+1,cmp);

    sol=0;
    for(int i=1;i<=n;i++)
    {
        best[i]=query(a[i].y,a[i].z)+1;
        sol=max(sol,best[i]);
        update(a[i].y,a[i].z,best[i],1);
    }
    for(int i=1;i<=n;i++) update(a[i].y,a[i].z,0,0);
}

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

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

        solve();
        printf("%d\n",sol);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}