Cod sursa(job #1171471)

Utilizator SpiderManSimoiu Robert SpiderMan Data 15 aprilie 2014 19:35:18
Problema Cutii Scor 100
Compilator cpp Status done
Runda ubb_acm_etapa_individuala1 Marime 1.46 kb
# include <algorithm>
# include <cstdio>
# include <cmath>
using namespace std;

struct cut {
    int X, Y, Z;
} A[3505];

int best[3505], aib[3505][3505];
int N, T;

const bool operator < (const cut &a, const cut &b) {
    return a.X < b.X;
}

inline void getmax (int &a, int b) {
    a = a > b ? a : b;
}

void update(int y, int z, int val) {
    for (int i = y; i <= N; i += i & -i)
        for (int j = z; j <= N; j += j & -j)
            getmax(aib[i][j], val);
}

inline int query (int y, int z) {
    int sol = 0;
    for (int i = y - 1; i > 0; i -= i & -i)
        for (int j = z - 1; j > 0; j -= j & -j)
            getmax(sol, aib[i][j]);
    return sol;
}

inline void reset (int y, int z) {
    for (int i = y; i <= N; i += i & -i)
        for (int j = z; j <= N; j += j & -j)
            aib[i][j] = 0;
}

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

    for (scanf ("%d %d", &N, &T); T; --T) {
        for (int i = 1; i <= N; ++i) {
            scanf ("%d %d %d", &A[i].X, &A[i].Y, &A[i].Z);
        }
        sort (A + 1, A + N + 1);
        int sol = 0;
        for (int i = 1; i <= N; ++i) {
            const int value = query(A[i].Y, A[i].Z);
            getmax(sol, value + 1);
            update(A[i].Y, A[i].Z, value + 1);
        }
        for (int i = 1; i <= N; ++i)
            reset(A[i].Y, A[i].Z);

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

    return 0;
}