Pagini recente » Cod sursa (job #1807849) | Cod sursa (job #2291744) | Cod sursa (job #2828472) | Cod sursa (job #2901755) | Cod sursa (job #1782166)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
const int Nmax = 3500;
struct Cutie {
int x, y, z;
Cutie(int _x = 0, int _y = 0, int _z = 0) : x(_x), y(_y), z(_z)
{
}
bool operator < (const Cutie &a) const
{
return z < a.z;
}
};
int n, t;
int aib[Nmax + 10][Nmax + 10];
void Update(int cx, int cy, int val);
int Query(int cx, int cy);
void Set(int cx, int cy);
int Solve(int n);
int main()
{
fin >> n >> t;
for(int i = 1; i <= t; i++)
fout << Solve(n) << '\n';
fin.close();
fout.close();
return 0;
}
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[i][j] = max(aib[i][j], val);
}
int Query(int x, int y)
{
int ans = 0;
for (int i = x; i > 0; i -= i & -i)
for (int j = y; j > 0; j -= j & -j)
ans = max(ans, aib[i][j]);
return ans;
}
void Set(int x, int y)
{
for (int i = x; i <= Nmax; i += i & -i)
for (int j = y; j <= Nmax; j += j & -j)
aib[i][j] = 0;
}
int Solve(int n)
{
int x, y, z, ans = 0, d;
vector<Cutie> C;
for (int i = 1; i <= n; i++)
{
fin >> x >> y >> z;
C.push_back(Cutie(x, y, z));
}
sort(C.begin(), C.end());
for (const auto& c : C)
{
d = Query(c.x - 1, c.y - 1) + 1;
Update(c.x, c.y, d);
ans = max(ans, d);
}
for (const auto& c : C)
Set(c.x, c.y);
return ans;
}