Cod sursa(job #1537341)

Utilizator algebristulFilip Berila algebristul Data 27 noiembrie 2015 09:26:24
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>

#define FILEIN "cutii.in"
#define FILEOUT "cutii.out"
#define NMAX 3505

using namespace std;

struct P {
    int x;
    int y;
    int z;

    bool operator<(const struct P& other) const {
        return x < other.x;
    }
};

struct P V[NMAX];
int D[NMAX][NMAX];
int n, t;

void update(int x, int y, int v) {
    while (x <= n) {
        int y1 = y;
        while (y1 <= n) {
            D[x][y1] = max(D[x][y1], v);
            y1 += (y1 & -y1);
        }
        x += (x & -x);
    }
}

int query(int x, int y) {
    int ans = 0;
    while (x) {
        int y1 = y;
        while (y1) {
            ans = max(ans, D[x][y1]);
            y1 -= (y1 & -y1);
        }
        x -= (x & -x);
    }

    return ans;
}

int main() {
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);

    cin >> n >> t;
    
    while (t--) {
        memset(D, 0, sizeof(D));
        memset(V, 0, sizeof(V));

        for (int i = 1; i <= n; i++) {
            cin >> V[i].x >> V[i].y >> V[i].z;
        }

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

        int ans = 0;

        for (int i = 1; i <= n; i++) {
            int q;

            ans = max(ans, q = query(V[i].y, V[i].z) + 1);
            update(V[i].y, V[i].z, q);
        }

        cout << ans << '\n';
    }
    return 0;
}