Cod sursa(job #1597717)

Utilizator andrei-sasAndrei Sas-Miresan andrei-sas Data 12 februarie 2016 11:38:38
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <fstream>
#include <algorithm>

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

using namespace std;

ifstream in("cutii.in");
ofstream g("cutii.out");

pair <int, pair <int, int> > v[3510];
int n,t,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 ()
{
    in>>n>>t;
    for (; t; --t)
    {
        for (int i = 1; i <= n; ++i)
            in>>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);

        g<<rez<<'\n';
    }
    in.close();
    g.close();
    return 0;
}