Cod sursa(job #3174750)

Utilizator SSKMFSS KMF SSKMF Data 25 noiembrie 2023 09:43:54
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream cin ("cutii.in");
ofstream cout ("cutii.out");

int maxim[3501][3501];

int main ()
{
    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);

        int lungime_maxima = 0;
        for (int indice = 0 ; indice < lungime ; indice++)
        {
            int lungime_1 = configuratie[indice] / 10000 % 10000 , lungime_2 = configuratie[indice] % 10000 , lungime_actuala = 1;
            for (int linie = lungime_1 - 1 ; linie ; linie ^= (linie & -linie)) {
                for (int coloana = lungime_2 - 1 ; coloana ; coloana ^= (coloana & -coloana)) {
                    lungime_actuala = max(lungime_actuala , maxim[linie][coloana] + 1);
                }
            }

            lungime_maxima = max(lungime_maxima , lungime_actuala);
            for (int linie = lungime_1 ; linie <= lungime ; linie += (linie & -linie)) {
                for (int coloana = lungime_2 ; coloana <= lungime ; coloana += (coloana & -coloana)) {
                    maxim[linie][coloana] = max(maxim[linie][coloana] , lungime_actuala);
                }
            }
        }

        for (int linie = 1 ; linie <= lungime ; linie++) {
            for (int coloana = 1 ; coloana <= lungime ; coloana++) {
                maxim[linie][coloana] = 0;
            }
        }

        cout << lungime_maxima << '\n';
    }

    cout.close(); cin.close();
    return 0;
}