Cod sursa(job #3183429)

Utilizator rapidu36Victor Manz rapidu36 Data 11 decembrie 2023 20:11:18
Problema Cutii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 3500;

short int n, aib[N+1][N+1];

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(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(short int lin, short int col, short int lg)
{
    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()
{
    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++)
    {
        for (short int j = 0; j <= n; j++)
        {
            aib[i][j] = 0;
        }
    }
    short int lg_max = 0;
    for (short int i = 0; i < n; i++)
    {
        short int lg = interogare(v[i].y - 1, v[i].z - 1);
        lg++;
        lg_max = max(lg_max, lg);
        actualizare(v[i].y, v[i].z, lg);
    }
    out << lg_max << "\n";
}

int main()
{
    int t;
    in >> n >> t;
    for (int i = 0; i < t; i++)
    {
        test();
    }
    in.close();
    out.close();
    return 0;
}