Cod sursa(job #2977622)

Utilizator pifaDumitru Andrei Denis pifa Data 12 februarie 2023 00:31:02
Problema Cutii Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, t;

struct ura
{
    int x, y, z;
};

ura v[3501];

int aib[3501][3501];

#define lsb(x)(x & (-x))

void update(int x, int y, int val)
{
    for(int i = x; i <= n; i += lsb(i))
    {
        for(int j = y; j <= n; j += lsb(j))
        {
            aib[i][j] = max(aib[i][j], val);
        }
    }
}

int compute(int x, int y)
{
    int ret = 0;
    for(int i = x; i > 0; i -= lsb(i))
    {
        for(int j = y; j > 0; j -= lsb(i))
        {
            ret = max(ret, aib[i][j]);
        }
    }
    return ret + 1;
}

void reset(int x, int y)
{
    for(int i = x; i <= n; i += lsb(i))
    {
        for(int j = y; j <= n; j += lsb(j))
        {
            aib[i][j] = 0;
        }
    }
}

int cmp(ura a, ura b)
{
   return a.z < b.z;
}

signed main()
{
    in >> n >> t;
    while(t--)
    {
        for(int i = 1; i <= n; i++)
            in >> v[i].x >> v[i].y >> v[i].z;
        sort(v + 1, v + n + 1, cmp);
        int rasp = 1;
        for(int i = 1; i <= n; i++)
        {
            int maxim = compute(v[i].x - 1, v[i].y - 1);
            update(v[i].x, v[i].y, maxim);
            rasp = max(rasp, maxim);
        }
        for(int i = 1; i <= n; i++)
            reset(v[i].x, v[i].y);
        out << rasp << '\n';
    }
    return 0;
}