Pagini recente » Cod sursa (job #1106096) | Cod sursa (job #1418315) | Cod sursa (job #1674916) | Cod sursa (job #37916) | Cod sursa (job #3168360)
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
struct box {
int x, y, z;
bool operator <(const box &rhs) const {
return x < rhs.x;
}
};
const int MAXN = 3505;
short int aib[MAXN][MAXN];
void clear(int y, int z) {
for(int j = y; j < MAXN; j += (j & -j)){
for(int k = z; k < MAXN; k += (k & -k)){
aib[j][k] = 0;
}
}
}
void update(int y, int z, short int add) {
for(int j = y; j < MAXN; j += (j & -j)){
for(int k = z; k < MAXN; k += (k & -k)){
aib[j][k] = max(aib[j][k], add);
}
}
}
int query(int y, int z) {
short int ans = 0;
for(int j = y; j > 0; j -= (j & -j)){
for(int k = z; k > 0; k -= (k & -k)){
ans = max(ans, aib[j][k]);
}
}
return ans;
}
int main() {
ifstream fin("cutii.in");
ofstream fout("cutii.out");
int t, n;
fin >> n >> t;
std::vector <box> vec(n);
while (t--) {
for (int i = 0; i < n; i++) {
fin >> vec[i].x >> vec[i].y >> vec[i].z;
}
sort(vec.begin(), vec.end());
int val, ans = -1;
for (int i = 0; i < n; i++) {
val = 1 + query(vec[i].y - 1, vec[i].z - 1);
update(vec[i].y, vec[i].z, val);
ans = max(ans, val);
}
for (int i = 0; i < n; i++) {
clear(vec[i].y, vec[i].z);
}
fout << ans << '\n';
}
}