Pagini recente » Cod sursa (job #2736353) | Cod sursa (job #2775409) | Cod sursa (job #2294892) | Cod sursa (job #77650) | Cod sursa (job #3252464)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <tuple>
using namespace std;
using VI = vector<int>;
using VVI = vector<VI>;
using TI = tuple<int, int, int>;
using VTI = vector<TI>;
VVI aib;
int NMAX = 3500;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
void Update(int x, int y, int val)
{
for (int i = x; i <= NMAX; i += i & -i)
for (int j = y; j <= NMAX; j += j & -j)
aib[x][y] = max(val, aib[i][j]);
}
int Query(int x, int y)
{
int sum = 0;
for (int i = x; i > 0; i -= i & -i)
for (int j = y; j > 0; j -= j & -j)
sum = max(aib[i][j], sum);
return sum;
}
void Reset(int x, int y)
{
for (int i = x; i <= NMAX; i += i & -i)
for (int j = y; j <= NMAX; j += j & -j)
aib[x][y] = 0;
}
int main()
{
int n, t;
VTI v(n);
aib = VVI(NMAX + 12, VI(NMAX + 12));
fin >> n >> t;
while (t--)
{
int a, b, c;
for (int i = 0; i < n; ++i)
{
fin >> a >> b >> c;
v[i] = {a, b, c};
}
sort(v.begin(), v.end(), [](TI a, TI b)
{
auto [a1, a2, a3] = a;
auto [b1, b2, b3] = b;
return a1 != b1 ? a1 < b1 : (a2 < b2);
});
int currmax = 0;
for (auto [a, b, c] : v)
{
currmax = max(Query(b, c) + 1, currmax);
Update(b + 1, c + 1, Query(b, c) + 1);
}
fout << currmax << '\n';
for (auto [a, b, c] : v)
{
Reset(b + 1, c + 1);
}
}
}