Cod sursa(job #1425973)

Utilizator justaddcodeJustadd Code justaddcode Data 28 aprilie 2015 17:41:10
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Nmax 3504
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
int n, i, j, t, best[Nmax];
int aib[Nmax][Nmax];
struct nod
{
    int x;
    int y;
    int z;
}  v[Nmax];
int cmp(const nod a, const nod b)
{
    if (a.x == b.x && a.y == b.y) return a.z > b.z;
    if (a.x == b.x) return a.y > b.y;
    return a.x < b.x;
}
void uaib(int x, int y, int z)
{
     int i, j;
     for (i = x; i <= n; i += zeros(i))
     for (j = y; j <= n; j += zeros(j))
     aib[i][j] = max(aib[i][j], z);
}
int val_max(int x, int y)
{
    int i, j, maxAIB = 0;
    for (i = x; i >= 1; i -= zeros(i))
    for (j = y; j >= 1; j -= zeros(j))
    maxAIB = max (aib[i][j], maxAIB);
    return maxAIB;
}
void readd()
{
    for (i = 1; i <= n; ++i)
    {
        scanf("%d %d %d", &v[i].x, &v[i].y, &v[i].z);
    }
    sort(v + 1, v + n + 1, cmp);
    for (i = 1; i <= n; ++i)
    {
        best[i] = val_max(v[i].y - 1, v[i].z - 1) + 1;
        uaib(v[i].y, v[i].z, best[i]);
    }
}
void solve()
{
    int sol = 0;
    for (i = 1; i <= n; ++i)
    sol = max(sol, best[i]);
    printf("%d\n", sol);
    memset(aib, 0, sizeof(aib));
    memset(best, 0, sizeof(best));
}
int main()
{
    freopen("cutii.in", "r", stdin);
    freopen("cutii.out", "w", stdout);
    scanf("%d %d", &n, &t);
    while (t--)
    {
        readd();
        solve();
    }
    return 0;
}