Cod sursa(job #3142594)

Utilizator David8406Marian David David8406 Data 22 iulie 2023 17:43:27
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
	#include <iostream>
	#include <algorithm>
	#include <fstream>
	using namespace std;
	int n,t, aib[3505][3505],dp[3505];
	struct box {
		int x, y, z;
	}c[3505];
	ifstream fin("scmax.in");
	ofstream fout("scmax.out");
	bool cmp(box a, box b) {
		return a.x < b.x;
	}
	void update(int poz1, int poz2, int val) {
		while (poz1 <= n) {
			int cpy = poz2;
			while (cpy <= n) {
				aib[poz1][cpy] = max(aib[poz1][cpy], val);
				cpy+=(cpy&(cpy^(cpy-1)));
			}
			poz1 += (poz1 & (poz1 ^ (poz1 - 1)));
		}
	}
	int query(int poz1, int poz2) {
		int rez = 0;
		while (poz1 > 0) {
			int cpy = poz2;
			while (cpy > 0) {
				rez = max(rez, aib[poz1][cpy]);
				cpy -= (cpy & (cpy ^ (cpy - 1)));
			}
			poz1 -= (poz1 & (poz1 ^ (poz1 - 1)));
		}
		return rez;
	}
	int main() {
		cin >> n >> t;
		for (int k = 1; k <= t; k++) {
			for (int i = 1; i <= n; i++) {
				cin >> c[i].x >> c[i].y >> c[i].z;
			}
			sort(c + 1, c + n + 1, cmp);
			for (int i = 1; i <= n; i++) {
				dp[i] = 1 + query(c[i].y-1, c[i].z-1);
				update(c[i].y, c[i].z, dp[i]);
			}
			int mx = 0;
			for (int i = 1; i <= n; i++)
				mx = max(mx, dp[i]);
			cout << mx << "\n";
			for (int i = 1; i <= n; i++)
				for (int j=1;j<=n;j++) aib[i][j] = 0;
		}
	}