Pagini recente » Cod sursa (job #2693935) | Cod sursa (job #1828936) | Cod sursa (job #1872328) | Cod sursa (job #2689621) | Cod sursa (job #2657197)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 3505;
struct Box
{
int first, second, third;
};
int N, aib[NMAX][NMAX];
Box box[NMAX];
int lsb(int x)
{
return (x & (-x));
}
void Update(int posi, int posj, int val)
{
for (int i = posi;i <= N;i += lsb(i))
for (int j = posj;j <= N;j += lsb(j))
aib[i][j] = max(aib[i][j], val);
}
void Clear(int posi, int posj)
{
for (int i = posi;i <= N;i += lsb(i))
for (int j = posj;j <= N;j += lsb(j))
aib[i][j] = 0;
}
int Query(int posi, int posj)
{
if (posi <= 0 || posj <= 0)
return 0;
int mx = 0;
for (int i = posi;i >= 1;i -= lsb(i))
for (int j = posj;j >= 1;j -= lsb(j))
mx = max(mx, aib[i][j]);
return mx;
}
int main()
{
ifstream fin("cutii.in");
ofstream fout("cutii.out");
int tests;
fin >> N >> tests;
while (tests-- > 0)
{
for (int i = 1;i <= N;++i)
fin >> box[i].first >> box[i].second >> box[i].third;
sort(box + 1, box + N + 1, [&](Box a, Box b)
{
return a.first < b.first;
});
int answer = 1;
for (int i = 1;i <= N;++i)
{
int val = Query(box[i].second - 1, box[i].third - 1) + 1;
Update(box[i].second, box[i].third, val);
answer = max(answer, val);
}
fout << answer << "\n";
for (int i = 1;i <= N;++i)
Clear(box[i].second, box[i].third);
}
fin.close();
fout.close();
return 0;
}