Cod sursa(job #2048139)

Utilizator osiaccrCristian Osiac osiaccr Data 25 octombrie 2017 19:29:01
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <algorithm>
#define DEF 3505

using namespace std;

struct cutie {
    int x, y, z;
} v[DEF];


ifstream fin ("cutii.in");
ofstream fout ("cutii.out");

int n, t,
D[DEF][DEF] //D[i][j] = numarul maxim de cutii cuibarite cu x <= i si y <= j
;

bool cmp (cutie a, cutie b) {
    return a.z < b.z;
}

int querry (int x, int y) {
    int r = 0;
    for (int i = x; i; i -= (i & -i))
        for (int j = y; j; j -= (j & -j))
            r = max (r, D[i][j]);
    return r;
}

void update (int x, int y, int a) {
    for (int i = x; i <= n; i += (i & -i))
        for (int j = y; j <= n; j += (j & -j))
            D[i][j] = max(D[i][j], a);
}

void curata () {
    for (int k = 1; k <= n; k++)
        for (int i = v[k].x; i <= n; i += (i & -i))
            for (int j = v[k].y; j <= n; j += (j & -j))
                D[i][j] = 0;
}

int main () {
    fin >> n >> t;
    for (; t; --t) {
        for (int i = 1; i <= n; i++) {
            fin >> v[i].x >> v[i].y >> v[i].z;
        }
        sort (v + 1, v + n + 1, cmp);
        for (int i = 1; i <= n; i++) {
            int rez = querry (v[i].x - 1, v[i].y - 1) + 1;
            update (v[i].x, v[i].y, rez);
        }
        fout << querry (n, n) << "\n";
        curata ();
    }
    return 0;
}