Pagini recente » Clasament dupa rating | Monitorul de evaluare | Cod sursa (job #2751444) | Diferente pentru home intre reviziile 392 si 391 | Cod sursa (job #1126579)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int N, T;
struct cutie {
int x, y, z;
cutie(int x, int y, int z) : x(x), y(y), z(z) { }
};
#define cmp(c) \
[] (const cutie& a, const cutie& b) -> bool { \
return a.c < b.c; \
}
vector<cutie> compute_lis(
const vector<cutie>& cutii,
const function<bool(const cutie&, const cutie&)>& cmpfun) {
vector<cutie> lis;
for(const auto& c : cutii) {
auto it = lower_bound(lis.begin(), lis.end(), c, cmpfun);
if(it != lis.end()) *it = c;
else lis.push_back(c);
}
return lis;
}
void solve_test() {
vector<cutie> cutii;
// read
for(int i = 0; i < N; ++i) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
cutii.push_back(cutie(x, y, z));
}
// sort
sort(cutii.begin(), cutii.end(), cmp(x));
// longest increasing subsequence
auto lis_y = compute_lis(cutii, cmp(y));
auto lis_z = compute_lis(cutii, cmp(z));
printf("%zu\n", lis_z.size());
}
int main(int argc, char *argv[]) {
freopen("cutii.in", "r", stdin);
freopen("cutii.out", "w", stdout);
scanf("%d%d", &N, &T);
while(T--) solve_test();
return 0;
}