Cod sursa(job #1429783)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 7 mai 2015 08:12:16
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <algorithm>

#define sum(x) (x&(-x))
#define f first
#define s second

using namespace std;

int aib[3510][3510], n, t;
pair < int, pair <int, int> > v[3510];

inline int query (int x, int y)
{
    int rez = 0;

    for (int i = x - 1; i; i -= sum (i))
        rez = max (rez, aib[i][y]);

    for (int i = y - 1; i; i -= sum (i))
        rez = max (rez, aib[x][i]);

    for (int i = x - 1; i; i -= sum (i))
        for (int j = y - 1; j; j -= sum (j))
            rez = max (rez, aib[i][j]);

    return rez + 1;
}

inline void add (int x, int y)
{
    for (int i = x + 1; i <= 3500; i += sum(i))
        aib[i][y] = max (aib[x][y], aib[i][y]);

    for (int i = y + 1; i <= 3500; i += sum(i))
        aib[x][i] = max (aib[x][y], aib[x][i]);

    for (int i = x + 1; i <= 3500; i += sum(i))
        for (int j = y + 1; j <= 3500; j += sum(j))
            aib[i][j] = max (aib[x][y], aib[i][j]);
}

inline void del (int x, int y)
{
    aib[x][y] = 0;
    for (int i = x + 1; i <= 3500; i += sum(i))
        aib[i][y] = 0;

    for (int i = y + 1; i <= 3500; i += sum(i))
        aib[x][i] = 0;

    for (int i = x + 1; i <= 3500; i += sum(i))
        for (int j = y + 1; j <= 3500; j += sum(j))
            aib[i][j] = 0;
}

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

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

    for (; t; --t)
    {
        for (int i = 1; i <= n; ++i)
            scanf ("%d %d %d", &v[i].f, &v[i].s.f, &v[i].s.s);

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

        int rez = 0;
        for (int i = 1; i <= n; ++i)
        {
            int x = query (v[i].s.f, v[i].s.s);
            rez = max (rez, x);

            aib[v[i].s.f][v[i].s.s] = x;
            add (v[i].s.f, v[i].s.s);
        }

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

        for (int i = 1; i <= n; ++i)
            del (v[i].s.f, v[i].s.s);
    }

    return 0;
}