Cod sursa(job #2631175)

Utilizator bem.andreiIceman bem.andrei Data 29 iunie 2020 12:15:05
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("cutii.in");
ofstream w("cutii.out");
int aib[3502][3502];
int n, t;
class str
{
public:
    int a, b, c;
    str()
    {
        a = 0;
        b = 0;
        c = 0;
    }
    bool operator < (const str &other) const &
    {
        return a < other.a;
    }
};
vector<str>boxes;
void update(int a, int b, int val)
{
    for (; a<=3502; a+=a&(-a))
    {
        for (int i = b; i <= 3502; i += i & (-i))
        {
            aib[a][i] = max(aib[a][i], val);
        }
    }
}

inline int querry(int a, int b)
{
    int ans = 0;
    for (; a; a -= a & (-a))
    {
        for (int c = b; c; c -= c & (-c))
            ans = max(ans, aib[a][c]);
    }
    return ans;
}
void init()
{
    for (auto it: boxes)
    {
        for (int i = it.b; i <= 3502; i += i & (-i))
        {
            for (int j = it.c; j <= 3502; j += j & (-j))
                aib[i][j] = 0;
        }
    }
}
void solve()
{
    init();
    boxes.clear();
}
int rez()
{
    int ans = 0;
    for (auto it: boxes)
    {
        int a = querry(it.b - 1, it.c - 1) + 1;
        update(it.b, it.c, a);
        ans = max(ans, a);
    }
    return ans;
}
int main()
{
    r>>n>>t;
    while(t--)
    {
        for (int i = 1; i <= n; ++i)
        {
            int a, b, c;
            r >> a >> b >> c;
            str aux;
            aux.a=a;
            aux.b=b;
            aux.c=c;
            boxes.push_back(aux);
        }
        sort(boxes.begin(), boxes.end());
        w<<rez()<<"\n";
        solve();
    }
    return 0;
}