Pagini recente » Cod sursa (job #2130330) | Cod sursa (job #1939470) | Cod sursa (job #2815251) | Cod sursa (job #2504401) | Cod sursa (job #1661916)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
class BIT
{
vector<vector<int>> _container;
int idx(int i)
{
return (i ^ (i - 1)) & i;
}
public:
BIT(int n, int m)
{
_container.resize(n + 1);
for (int i = 1; i <= n; i++)
{
_container[i].resize(m + 1);
}
}
void Update(int a, int b, int value)
{
for (int i = a; i <= _container.size() - 1; i+=idx(i))
{
for (int j = b; j <= _container[i].size() - 1; j += idx(j))
{
_container[i][j] = max(_container[i][j], value);
}
}
}
int Query(int a, int b)
{
int result = 0;
for (int i = a; i > 0; i -= idx(i))
{
for (int j = b; j > 0; j -= idx(j))
{
if (_container[i][j] > result)
{
result = _container[i][j];
}
}
}
return result;
}
};
class Box
{
public:
int x, y, z;
Box(){ }
Box(int a, int b, int c)
{
x = a;
y = b;
z = c;
}
bool operator<(Box& other)
{
return x > other.x;
}
};
int main()
{
int N, T, i, j, a, b, c;
vector<Box> boxes;
vector<int> best;
ifstream f("cutii.in");
ofstream g("cutii.out");
f >> N >> T;
best.resize(N + 1);
for (; T > 0; T--)
{
fill(best.begin(), best.end(), 0);
boxes.clear();
for (i = 1; i <= N; i++)
{
f >> a >> b >> c;
boxes.push_back(Box(a, b, c));
}
sort(boxes.begin(), boxes.end());
best[1] = 1;
BIT bit(N, N);
bit.Update(boxes[0].y, boxes[0].z, 1);
for (j = 2; j <= N; j++)
{
best[j] = bit.Query(boxes[j-1].y + 1, boxes[j-1].z + 1) + 1;
bit.Update(boxes[j - 1].y, boxes[j - 1].z, best[j]);
}
g << best[N] << "\n";
}
f.close();
g.close();
return 0;
}