Cod sursa(job #1322197)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 19 ianuarie 2015 20:54:21
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <algorithm>
#include <cstdio>

#define DMAX 3505
using namespace std;

int aib[DMAX][DMAX], n, t;

struct cutie
{
    int x, y, z;

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

cutie v[DMAX];


int lsb(int x)
{
    return ((x^(x-1))&x);
}

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

}

int query(int x, int y)
{
    int ans=0;
    for(int i=x; i>0; i-=lsb(i))
        for(int j=y; j>0; j-=lsb(j))
            ans=max(aib[i][j], ans);
    return ans;
}

void solve()
{
    for(int i=1; i<=n; i++)
        scanf("%i %i %i", &v[i].x, &v[i].y, &v[i].z);//cin>>v[i].x>>v[i].y>>v[i].z;

    sort(v+1, v+n+1, cutie());

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

cout<<sol;

}

void set_aib()
{
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        aib[i][j]=0;
}

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

    scanf("%i %i", &n, &t);//cin>>n>>t;

    for(int i=1; i<=t; i++)
    {
        set_aib();
        solve();
    }

    return 0;
}