Cod sursa(job #2676353)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 24 noiembrie 2020 09:20:04
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
const int MaxN = 3501;

struct seg {
	seg() {
		d = src = 0;
	}
	int d, src;
};

struct str { int a, b, c; };
str cutii[MaxN];
seg tree[4 * MaxN];

int v[MaxN], ind[MaxN], k[MaxN], sol[MaxN], in[MaxN];

static inline int lSon(int node) {
	return (node << 1);
}

static inline int rSon(int node) {
	return (node << 1) + 1;
}

void update(int node, int st, int dr, int i, int val, int s) {
	int mij = (st + dr) / 2;
	if (st == dr) {
		tree[node].d = val;
		tree[node].src = s;
		return;
	}
	if (i <= mij) {
		update(lSon(node), st, mij, i, val, s);
	}
	else {
		update(rSon(node), mij + 1, dr, i, val, s);
	}
	if (tree[lSon(node)].d > tree[rSon(node)].d) {
		tree[node].d = tree[lSon(node)].d;
		tree[node].src = tree[lSon(node)].src;
	}
	else {
		tree[node].d = tree[rSon(node)].d;
		tree[node].src = tree[rSon(node)].src;
	}
}

int qi = 0;

seg query(int node, int st, int dr, int x, int y) {
	int mij = (st + dr) / 2;
	seg l, r;
	if (x <= st && dr <= y) {
		return tree[node];
	}
	if (x <= mij) {
		l = query(lSon(node), st, mij, x, y);
	}
	if (y > mij) {
		r = query(rSon(node), mij + 1, dr, x, y);
	}
	if (l.d > r.d) {
		qi = l.src;
		return l;
	}
	else {
		qi = r.src;
		return r;
	}
}

int cmp(int a, int b) {
	return v[a] < v[b];
}

bool comp(int i, int j) {
	if (cutii[i].a > cutii[j].a && cutii[i].b > cutii[j].b && cutii[i].c > cutii[j].c)
		return true;
	return false;
}

int nrm[MaxN];

int main() {
	int n, t, i, j;
	int nr;
	fin >> n >> t;
	while (t--) {
		for (int i = 1; i <= 4 * n; ++i)
			tree[i].d = tree[i].src = 0;
		for (i = 1; i <= n; ++i) {
			fin >> cutii[i].a >> cutii[i].b >> cutii[i].c;
			k[i] = sol[i] = nrm[i] = 0;
			v[i] = 1;
			ind[i] = i;
			qi = 0;
		}
		for (i = 1; i <= n; ++i)
			for (j = 1; j <= n; ++j)
				if (comp(i, j))
					++v[i];

		sort(ind + 1, ind + n + 1, cmp);////sortare cu tot cu indici
		j = 0;
		for (i = 1; i <= n; ++i) {////partea de normalizare
			if (v[ind[i]] == v[ind[i - 1]]) {
				nrm[ind[i]] = j;
			}
			else {
				++j;
				nrm[ind[i]] = j;
			}
		}
		for (i = 1; i <= n; ++i) {
			qi = 0;
			if (nrm[i] != 1) {
				nr = query(1, 1, n, 1, nrm[i] - 1).d + 1;
			}
			else {
				nr = 1;
			}
			k[i] = qi;
			update(1, 1, n, nrm[i], nr, i);
		}
		fout << tree[1].d << "\n";
	}

	fin.close();
	fout.close();
	return 0;
}