Pagini recente » Cod sursa (job #686670) | Istoria paginii utilizator/georgiana.diana | Monitorul de evaluare | Cod sursa (job #963064) | Cod sursa (job #788531)
Cod sursa(job #788531)
#include <cstdio>
#include <cstdlib>
#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(; pos1 <= N; pos1 += (pos1 & (-pos1)))
for(; pos2 <= N; pos2 += (pos2 & (-pos2)))
aib[pos1][pos2] = max(aib[pos1][pos2], val);
}
void UpdateOut(int pos1, int pos2)
{
for(; pos1 <= N; pos1 += (pos1 & (-pos1)))
for(; pos2 <= N; pos2 += (pos2 & (-pos2)))
aib[pos1][pos2] = 0;
}
int Query(int pos1, int pos2)
{
int sum = 0;
for(; pos1; pos1 -= (pos1 & (-pos1)))
for(; pos2; pos2 -= (pos2 & (-pos2)))
sum += aib[pos1][pos2];
return sum;
}
int main()
{
freopen("cutii.in", "r", stdin);
freopen("cutii.out", "w", stdout);
int i;
scanf("%i %i", &N, &T);
for(; T; T --)
{
for(i = 1; i <= N; i++)
scanf("%i %i %i", &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);
printf("%i\n", ans);
}
return 0;
}