Cod sursa(job #1957815)

Utilizator EzrealHorodinca Mihai Ezreal Data 7 aprilie 2017 19:52:23
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <algorithm>

#define Max 3510

using namespace std;

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

struct cutie
{
    int x, y, z;
    bool operator <(const cutie &aux) const
    {
        return x<aux.x;
    }
}v[Max];
int aib2d[Max][Max],d[Max],n;

void aib2dUpdate(int x,int y,int s)
{
    for(int i = x;i <= n;i+= i & (-i))
        for(int j = y;j <= n;j+= j & (-j))
            aib2d[i][j] = max(aib2d[i][j], s);
}

int aib2dQuery(int x,int y)
{
    int s = 0;
    for(int i = x;i >= 1;i-= i & (-i))
        for(int j = y;j >= 1;j-= j & (-j))
            s = max(s,aib2d[i][j]);

    return s;
}

void aib2dClear(int x,int y)
{
    for(int i = x;i <=n ;i+= i & (-i))
        for(int j = y;j <= n;j+= j & (-j))
            aib2d[i][j] = 0;
}

int main()
{
    int t;
    in >> n >> t;
    for(;t;t--)
    {
        int cevap = 0;
        for(int i = 1;i <= n;i++)
            in >> v[i].x >> v[i].y >> v[i].z;

        sort(v + 1,v + 1 + n);

        for(int i = 1;i <= n;i++)
        {
            int s = aib2dQuery(v[i].y-1,v[i].z-1);
            d[i]=s + 1;
            aib2dUpdate(v[i].y,v[i].z,d[i]);
        }
        for(int i = 1;i <= n;i++)
            cevap = max(cevap,d[i]);

        out << cevap << "\n";

        for(int i = 1;i <= n;i++)
            aib2dClear(v[i].y,v[i].z);
    }
    return 0;
}