Pagini recente » Cod sursa (job #1250582) | Cod sursa (job #1546815) | Cod sursa (job #2345816) | Cod sursa (job #2802138) | Cod sursa (job #788535)
Cod sursa(job #788535)
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
struct data
{
int x, y, z;
}V[3510];
int aib[3510][3510], sol[3510], ans, N, T;
bool cmp(data one, data two)
{
return one.x < two.x;
}
void UpdateMax(int pos1, int pos2, int val)
{
for(int i = pos1; i <= N; i += (i & (-i)))
for(int j = pos2; j <= N; j += (j & (-j)))
aib[i][j] = max(aib[i][j], val);
}
void UpdateOut(int pos1, int pos2)
{
for(int i = pos1; i <= N; i += (i & (-i)))
for(int j = pos2; j <= N; j += (j & (-j)))
aib[i][j] = 0;
}
int Query(int pos1, int pos2)
{
int S = 0;
for(int i = pos1; i; i -= (i & (-i)))
for(int j = pos2; j; j -= (j & (-j)))
S = max(S, aib[i][j]);
return S;
}
int main()
{
ifstream in("cutii.in");
ofstream out("cutii.out");
int i;
in >> N >> T;
for(; T; T --)
{
for(i = 1; i <= N; i++)
in >> V[i].x >> V[i].y >> V[i].z;
sort(V + 1, V + N + 1, cmp);
ans = 0;
for(i = 1; i <= N; i++)
{
sol[i] = Query(V[i].y - 1, V[i].z - 1) + 1;
ans = max(ans, sol[i]);
UpdateMax(V[i].y, V[i].z, sol[i]);
}
for(i = 1; i <= N; i++)
UpdateOut(V[i].y, V[i].z);
out << ans << "\n";
}
return 0;
}