Cod sursa(job #3168359)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 12 noiembrie 2023 11:40:37
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#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;

int aib[MAXN][MAXN];

void update(int y, int z, 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) {
	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--) {
		std::memset(aib, 0x00, sizeof(aib));
		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);
		}
		fout << ans << '\n';
	}
}