Cod sursa(job #2657197)

Utilizator trifangrobertRobert Trifan trifangrobert Data 10 octombrie 2020 00:48:39
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 3505;
struct Box
{
    int first, second, third;
};
int N, aib[NMAX][NMAX];
Box box[NMAX];

int lsb(int x)
{
    return (x & (-x));
}

void Update(int posi, int posj, int val)
{
    for (int i = posi;i <= N;i += lsb(i))
        for (int j = posj;j <= N;j += lsb(j))
            aib[i][j] = max(aib[i][j], val);
}

void Clear(int posi, int posj)
{
    for (int i = posi;i <= N;i += lsb(i))
        for (int j = posj;j <= N;j += lsb(j))
            aib[i][j] = 0;
}

int Query(int posi, int posj)
{
    if (posi <= 0 || posj <= 0)
        return 0;
    int mx = 0;
    for (int i = posi;i >= 1;i -= lsb(i))
        for (int j = posj;j >= 1;j -= lsb(j))
            mx = max(mx, aib[i][j]);
    return mx;
}

int main()
{
    ifstream fin("cutii.in");
    ofstream fout("cutii.out");
    int tests;
    fin >> N >> tests;
    while (tests-- > 0)
    {
        for (int i = 1;i <= N;++i)
            fin >> box[i].first >> box[i].second >> box[i].third;
        sort(box + 1, box + N + 1, [&](Box a, Box b)
            {
                return a.first < b.first;
            });
        int answer = 1;
        for (int i = 1;i <= N;++i)
        {
            int val = Query(box[i].second - 1, box[i].third - 1) + 1;
            Update(box[i].second, box[i].third, val);
            answer = max(answer, val);
        }
        fout << answer << "\n";
        for (int i = 1;i <= N;++i)
            Clear(box[i].second, box[i].third);
    }
    fin.close();
    fout.close();
    return 0;
}