Pagini recente » Cod sursa (job #2201168) | Cod sursa (job #402590) | Istoria paginii home | Cod sursa (job #576448) | Cod sursa (job #3174764)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin ("cutii.in");
ofstream cout ("cutii.out");
short int maxim[3501][3501];
int main ()
{
short int lungime , numar_teste;
cin >> lungime >> numar_teste;
while (numar_teste--)
{
long long configuratie[3500];
for (int indice = 0 , valoare ; indice < lungime ; indice++)
{
cin >> valoare; configuratie[indice] = 100000000LL * valoare;
cin >> valoare; configuratie[indice] += 10000 * valoare;
cin >> valoare; configuratie[indice] += valoare;
}
sort(configuratie , configuratie + lungime);
short int lungime_maxima = 0;
for (short int indice = 0 ; indice < lungime ; indice++)
{
short int lungime_1 = configuratie[indice] / 10000 % 10000 , lungime_2 = configuratie[indice] % 10000 , lungime_actuala = 1;
for (short int linie = lungime_1 - 1 ; linie ; linie ^= (linie & -linie)) {
for (short int coloana = lungime_2 - 1 ; coloana ; coloana ^= (coloana & -coloana)) {
lungime_actuala = max(lungime_actuala , (short int)(maxim[linie][coloana] + 1));
}
}
lungime_maxima = max(lungime_maxima , lungime_actuala);
for (short int linie = lungime_1 ; linie <= lungime ; linie += (linie & -linie)) {
for (short int coloana = lungime_2 ; coloana <= lungime ; coloana += (coloana & -coloana)) {
maxim[linie][coloana] = max(maxim[linie][coloana] , lungime_actuala);
}
}
}
for (short int indice = 0 ; indice < lungime ; indice++)
{
short int lungime_1 = configuratie[indice] / 10000 % 10000 , lungime_2 = configuratie[indice] % 10000;
for (short int linie = lungime_1 ; linie <= lungime ; linie += (linie & -linie)) {
for (short int coloana = lungime_2 ; coloana <= lungime ; coloana += (coloana & -coloana)) {
maxim[linie][coloana] = 0;
}
}
}
cout << lungime_maxima << '\n';
}
cout.close(); cin.close();
return 0;
}