Cod sursa(job #1225554)

Utilizator rangerChihai Mihai ranger Data 2 septembrie 2014 20:43:12
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

#define nmax 3510
int N, T, D[nmax], AIB[nmax][nmax], rs;
struct cutie
{
    int x, y, z;
};
bool cmp(cutie a, cutie b) {
 return  (a.z < b.z);
 }
cutie C[nmax];

int Max (int x, int y)
{
    int Mx = 0;
    for (;x; x -= (x & -x))
        for (int y1 = y; y1; y1 -= (y1 & -y1))
        Mx = max(Mx, AIB[x][y1]);
    return Mx;
}

void update(int x, int y, int val)
{
    for (;x <= N; x += (x & -x))
        for (int y1 = y; y1 <= N; y1 += (y1 & -y1) )
        if (AIB[x][y1] < val) AIB[x][y1] = val;
}

int main()
{
    freopen("cutii.in","r", stdin);
    freopen("cutii.out","w",stdout);
    scanf("%d%d", &N, &T);
    while (T -- ) {
        rs = 1;
        memset(AIB, 0, sizeof(AIB));
        for (int i = 1; i <= N; i++)
            scanf("%d%d%d", &C[i].x, &C[i].y, &C[i].z);
        sort(C + 1, C + N + 1, cmp);
        for (int i = 1; i <= N; i++) {
            D[i] = Max(C[i].x-1, C[i].y-1) + 1;
            update(C[i].x, C[i].y, D[i]);
            rs = max(rs, D[i]);
        }
       printf("%d\n", rs);
    }
    return  0;
}