Pagini recente » Cod sursa (job #1990778) | Cod sursa (job #2472463) | Cod sursa (job #1481061) | Cod sursa (job #3188585) | Cod sursa (job #3189312)
#include <fstream>
#include <algorithm>
using namespace std;
/// erase, getMax, query
ifstream f("cutii.in");
ofstream g("cutii.out");
int aib[3505][3505], n, t;
struct punct
{
int a, b, c;
}v[3505];
bool comp (punct x, punct z)
{
return x.a < z.a;
}
int query(int a, int b)
{
int maxi = -1;
for (int i = a; i; i -= (i & (-i))) {
for (int j = b; j; j -= (j & (-j))) {
maxi = max(aib[i][j], maxi);
}
}
return maxi;
}
void update(int a, int b, int val)
{
for (int i = a; i <= n; i += (i & (-i))) {
for (int j = b; j <= n; j += (j & (-j))) {
aib[i][j] = max(aib[i][j], val);
}
}
}
void sterge(int a, int b)
{
for (int i = a; i <= n; i += (i & (-i))) {
for (int j = b; j <= n; j += (j & (-j))) {
aib[i][j] = 0;
}
}
}
int main()
{
f >> n >> t;
while (t--) {
int ans = 0;
for (int i = 1; i <= n; ++i) {
f >> v[i].a >> v[i].b >> v[i].c;
}
sort(v + 1, v + n + 1, comp);
for (int i = 1; i <= n; ++i) {
int cost = query(v[i].b, v[i].c) + 1;
update(v[i].b, v[i].c, cost);
ans = max(ans, cost);
}
g << ans << '\n';
for (int i = 1; i <= n; ++i) {
sterge(v[i].b, v[i].c);
}
}
return 0;
}