Cod sursa(job #1937197)

Utilizator facelessIonut Balauca faceless Data 23 martie 2017 19:37:00
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

struct Cutie{
    int x, y, z;

    bool operator < (const Cutie & A) const
    {
        return z < A.z;
    }
};

int Aib[3502][3502];
int N, T, ans;
vector <Cutie> V;

void Update(int x, int y, int val)
{
    for (int i = x; i <= N; i += i & -i)
        for (int j = y; j <= N; j += j & -j)
            Aib[i][j] = max(Aib[i][j], val);
}
int Query(int x, int y)
{
    int ans = 0;
    for (int i = x; i > 0; i -= i & -i)
        for (int j = y; j > 0; j -= j & -j)
            ans = max(Aib[i][j], ans);
    return ans;
}
void Empty(int x, int y)
{
    for (int i = x; i <= N; i += i & -i)
        for (int j = y; j <= N; j += j & -j)
            Aib[i][j] = 0;
}

void solve();

int main()
{
    f >> N >> T;
    for (; T--;)
        solve();
    f.close();
    g.close();
    return 0;
}

void solve()
{
    V = vector <Cutie> (N + 1);
    for (int i = 1; i <= N; ++i)
        f >> V[i].x >> V[i].y >> V[i].z;
    sort (V.begin() + 1, V.end());
    ans = 0;
    for (int i = 1; i <= N; ++i)
    {
        int nr_maxim_patrate = Query(V[i].x - 1, V[i].y - 1); //nr de patrate din interior
        ++nr_maxim_patrate;
        Update(V[i].x, V[i].y, nr_maxim_patrate);
        ans = max(ans, nr_maxim_patrate);
    }
    g << ans << "\n";
    for (int i = 1; i <= N; ++i)
        Empty(V[i].x, V[i].y);
}