Cod sursa(job #2800743)

Utilizator domistnSatnoianu Dominic Ioan domistn Data 13 noiembrie 2021 21:19:50
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>
#include <algorithm>
#include <cstring>

#define NMAX 3505

using namespace std;

struct elem {
    int x, y, z;
} cutii[NMAX];

short tests;
int n, fwt[NMAX][NMAX];

inline int queryFwt(int X, int Y) {
    int ANS = 0;
    for(int i = X; i > 0; i -= i & -i)
        for(int j = Y; j > 0; j -= j & -j)
            ANS = max(ANS, fwt[i][j]);
    return ANS;
}

inline void updateFwt(int X, int Y, const int VAL) {
    for(int i = X; i <= n; i += i & -i)
        for(int j = Y; j <= n; j += j & -j)
            fwt[i][j] = max(fwt[i][j], VAL);
}

void solve() {
    memset(fwt, 0, sizeof(fwt));
    for(int i = 1; i <= n; ++i)
        scanf("%d%d%d", &cutii[i].x, &cutii[i].y, &cutii[i].z);
    sort(cutii + 1, cutii + n + 1, [](const elem X, const elem Y) {
         return X.z < Y.z;
    });
    for(int i = 1; i <= n; ++i) {
        const int crt = queryFwt(cutii[i].x, cutii[i].y) + 1;
        updateFwt(cutii[i].x, cutii[i].y, crt);
    }
    printf("%d\n", queryFwt(n, n));
}

int main()
{
    freopen("cutii.in", "r", stdin);
    //freopen("cutii.out", "w", stdout);
    scanf("%d%hd", &n, &tests);
    while(tests--) solve();
    return 0;
}