Cod sursa(job #2800761)

Utilizator domistnSatnoianu Dominic Ioan domistn Data 13 noiembrie 2021 21:51:46
Problema Cutii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>

#define NMAX 3505

using namespace std;

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

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;
        fin >> 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);
    }
    fout << queryFwt(n, n) << "\n";
    for(int i = 1; i <= n; ++i)
        clearFwt(cutii[i].first, cutii[i].second);
}

int main()
{
    fin >> n >> tests;
    while(tests--) solve();
    return 0;
}