Cod sursa(job #1522215)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 11 noiembrie 2015 13:27:36
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <algorithm>

#define tt first
#define f second.tt
#define s second.second

using namespace std;

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

inline void add (int a, int b)
{
    for (int i = a; i <= n; i += i & (-i))
        for (int j = b; j <= n; j += j & (-j))
            aib[i][j] = max (aib[i][j], aib[a][b]);
}

inline int querry (int a, int b)
{
    int rez = 0;
    for (int i = a - 1; i; i -= i & (-i))
        for (int j = b - 1; j; j -= j & (-j))
            rez = max (aib[i][j], rez);

    return rez;
}

inline void del (int a, int b)
{
    for (int i = a; i <= n; i += i & (-i))
        for (int j = b; j <= n; j += j & (-j))
            aib[i][j] = 0;
}

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

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

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

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

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

            rez = max (rez, x);
        }

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

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

    return 0;
}