Cod sursa(job #2800758)

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

#define NMAX 3505

using namespace std;

short tests;
int n, fwt[NMAX][NMAX];
pair<int, int> cutii[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);
}

inline void clearFwt(int X, int Y) {
    for(int i = X; i <= n; i += i & -i)
        for(int j = Y; j <= n; j += j & -j)
            fwt[i][j] = 0;
}

void solve() {
    for(int i = 1; i <= n; ++i) {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        cutii[z] = {x, y};
    }
    for(int i = 1; i <= n; ++i) {
        const int crt = queryFwt(cutii[i].first, cutii[i].second) + 1;
        updateFwt(cutii[i].first, cutii[i].second, crt);
    }
    printf("%d\n", queryFwt(n, n));
    for(int i = 1; i <= n; ++i)
        clearFwt(cutii[i].first, cutii[i].second);
}

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