Cod sursa(job #1071185)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 2 ianuarie 2014 18:14:29
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <memory.h>

using namespace std;

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

const int Nmax = 3510;

int T, N, AIB[Nmax][Nmax], sol;

struct cutie{
    int x, y, z;
}V[Nmax];

bool cmp(const cutie &a, const cutie &b) {return a.z < b.z;}

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))
            if(val > AIB[i][j]) AIB[i][j] = val;
}

int Query(int x, int y)
{
    int max = 0;
    for(int i = x; i ; i -= i & (-i))
        for(int j = y; j ; j -= j & (-j))
            if(max < AIB[i][j]) max = AIB[i][j];
    return max;
}

void Reset()
{
    memset(AIB, 0, sizeof AIB);
    memset(V, 0, sizeof V);
    sol = 0;
}

int main()
{
    fin>>N>>T;
    while(T--)
    {
        for(int i=1; i <= N; i++)
            fin>>V[i].x>>V[i].y>>V[i].z;
        sort(V + 1, V + N + 1, cmp);

        for(int i=1; i <= N; i++)
        {
            int best = Query(V[i].x, V[i].y) + 1;
            Update(V[i].x, V[i].y, best);
            if(sol < best) sol = best;
        }

        fout<<sol<<'\n';
        Reset();
    }
    return 0;
}