Pagini recente » Cod sursa (job #2292903) | Cod sursa (job #1610904) | Cod sursa (job #2104227) | Cod sursa (job #3228208) | Cod sursa (job #3183423)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
struct cutie
{
short int x, y, z;
};
ifstream in("cutii.in");
ofstream out("cutii.out");
bool cmp(cutie c1, cutie c2)
{
if (c1.x == c2.x)
{
if (c1.y == c2.y)
{
return (c1.z > c2.z);
}
return (c1.y > c2.y);
}
return (c1.x < c2.x);
}
short int interogare(vector <vector <short int>> &aib, short int lin, short int col)
{
short int l_max = 0;
while (lin != 0)
{
short int col_c = col;
while (col_c != 0)
{
l_max = max(l_max, aib[lin][col_c]);
short int p2 = (col_c & (-col_c));
col_c -= p2;
}
short int p2 = (lin & (-lin));
lin -= p2;
}
return l_max;
}
void actualizare(vector <vector <short int>> &aib, short int lin, short int col, short int lg)
{
short int n = (short int)aib.size() - 1;
while (lin <= n)
{
short int col_c = col;
while (col_c <= n)
{
aib[lin][col_c] = max(aib[lin][col_c], lg);
short int p2 = (col_c & (-col_c));
col_c += p2;
}
short int p2 = (lin & (-lin));
lin += p2;
}
}
void test(int n)
{
vector <cutie> v(n);
for (short int i = 0; i < n; i++)
{
in >> v[i].x >> v[i].y >> v[i].z;
}
sort(v.begin(), v.end(), cmp);
vector < vector <short int>> aib(n + 1);
for (short int i = 0; i <= n; i++)
{
vector <short int> aux(n + 1, 0);
aib[i] = aux;
}
short int lg_max = 0;
for (short int i = 0; i < n; i++)
{
short int lg = interogare(aib, v[i].y - 1, v[i].z - 1);
lg++;
lg_max = max(lg_max, lg);
actualizare(aib, v[i].y, v[i].z, lg);
}
out << lg_max << "\n";
}
int main()
{
int n, t;
in >> n >> t;
for (int i = 0; i < t; i++)
{
test(n);
}
in.close();
out.close();
return 0;
}