Cod sursa(job #2049344)

Utilizator Coroian_DavidCoroian David Coroian_David Data 27 octombrie 2017 08:44:30
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>

#define MAX_N 3500

using namespace std;

FILE *f, *g;

int n;

int dp[MAX_N + 1];

struct elem
{
    int x, y, z;
};

elem v[MAX_N + 1];

struct cmp
{
    bool operator () (const elem &a, const elem &b) const
    {
        return a.x < b.x;
    }
};

short aib[MAX_N + 1][MAX_N + 1];

void initAib(int n)
{
    int i, j;
    for(i = 0; i <= n; i ++)
    {
        for(j = 0; j <= n; j ++)
            aib[i][j] = 0;
    }
}

void add(int y, int z, int nr)
{
    while(y <= n)
    {
        int cz = z;

        while(z <= n)
        {
            aib[y][z] = max(aib[y][z], (short)nr);

            z += z & (-z);
        }

        z = cz;

        y += y & (-y);
    }
}

int getMax(int y, int z)
{
    int rez = 0;

    while(y > 0)
    {
        int cz = z;

        while(z > 0)
        {
            rez = max(rez, (int)aib[y][z]);

            z -= z & (-z);
        }

        z = cz;

        y -= y & (-y);
    }

    return rez;
}

void rimuv(int y, int z)
{
    while(y <= n)
    {
        int cz = z;

        while(z <= n)
        {
            aib[y][z] = 0;

            z += z & (-z);
        }

        z = cz;

        y += y & (-y);
    }
}

void solve()
{
    sort(v + 1, v + n + 1, cmp());

    int i;
    int rez = 1;

    dp[1] = 1;
    add(v[1].y, v[1].z, 1);

    for(i = 2; i <= n; i ++)
    {
        dp[i] = getMax(v[i].y, v[i].z) + 1;

        add(v[i].y, v[i].z, dp[i]);

        rez = max(rez, dp[i]);
    }

    fprintf(g, "%d\n", rez);

    rimuv(v[1].y, v[1].z);

    for(i = 2; i <= n; i ++)
        rimuv(v[i].y, v[i].z);
}

void ansQues()
{
    initAib(MAX_N);

    f = fopen("cutii.in", "r");
    g = fopen("cutii.out", "w");

    int t;
    fscanf(f, "%d%d", &n, &t);

    while(t > 0)
    {
        int i;
        for(i = 1; i <= n; i ++)
            fscanf(f, "%d%d%d", &v[i].x, &v[i].y, &v[i].z);

        solve();

        t --;
    }

    fclose(f);
    fclose(g);
}

int main()
{
    ansQues();

    return 0;
}