Pagini recente » Cod sursa (job #3150313) | Istoria paginii utilizator/tudornicorescu | Cod sursa (job #2885331) | Cod sursa (job #689214) | Cod sursa (job #1171514)
#include <fstream>
#include <algorithm>
using namespace std;
struct cutie {
int x,y,z;
}a[3505];
int n,t;
int arbore[3505][3505];
ofstream g("cutii.out");
bool compara(cutie a, cutie b)
{
return a.x<b.x;
}
void adaugaInArbore(int& a, int& b, int valoare)
{
for (int i=a; i<=n; i=(i|(i-1))+1)
for (int j=b; j<=n; j=(j|(j-1))+1)
if (valoare!=0)
{
if (arbore[i][j]<valoare)
arbore[i][j]=valoare;
}
else
{
arbore[i][j]=valoare;
}
}
int obtine(int&a, int& b)
{
int s=0;
for (int i=a-1; i>=1; i=i&(i-1))
for (int j=b-1; j>=1; j=j&(j-1))
if (s<arbore[i][j])
s=arbore[i][j];
return s;
}
void solve()
{
int rezultat=0;
for (int i=1; i<=n; i++)
{
int s1=obtine(a[i].y,a[i].z)+1;
if (rezultat<s1)
rezultat=s1;
adaugaInArbore(a[i].y,a[i].z,s1);
}
for (int i=1; i<=n; i++)
adaugaInArbore(a[i].y,a[i].z,0);
g<<rezultat<<"\n";
}
int main()
{
ifstream f("cutii.in");
f>>n>>t;
for (int k=1; k<=t; k++)
{
for (int i=1; i<=n; i++)
f>>a[i].x>>a[i].y>>a[i].z;
sort(a+1,a+n+1,compara);
solve();
}
}