Pagini recente » Cod sursa (job #1158330) | Cod sursa (job #421324) | Cod sursa (job #2907791) | Cod sursa (job #3030524) | Cod sursa (job #1920561)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("cutii.in");
ofstream g("cutii.out");
struct Cutie{
int x, y, z;
bool operator < (const Cutie & A) const
{
return z < A.z;
}
};
int Aib[3502][3502];
int N, T, ans;
vector <Cutie> V;
void Update(int x, int y, int val)
{
for (int i = x; i <= N; i += i & -i)
for (int j = y; j <= N; 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(Aib[i][j], ans);
return ans;
}
void Empty(int x, int y)
{
for (int i = x; i <= N; i += i & -i)
for (int j = y; j <= N; j += j & -j)
Aib[i][j] = 0;
}
void solve();
int main()
{
f >> N >> T;
for (; T--;)
solve();
f.close();
g.close();
return 0;
}
void solve()
{
V = vector <Cutie> (N + 1);
for (int i = 1; i <= N; ++i)
f >> V[i].x >> V[i].y >> V[i].z;
sort (V.begin() + 1, V.end());
ans = 0;
for (int i = 1; i <= N; ++i)
{
int nr_maxim_patrate = Query(V[i].x - 1, V[i].y - 1); //nr de patrate din interior
++nr_maxim_patrate;
Update(V[i].x, V[i].y, nr_maxim_patrate);
ans = max(ans, nr_maxim_patrate);
}
g << ans << "\n";
for (int i = 1; i <= N; ++i)
Empty(V[i].x, V[i].y);
}