Cod sursa(job #1642507)

Utilizator mirupetPetcan Miruna mirupet Data 9 martie 2016 14:32:44
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<cstdio>
#include<algorithm>
#include<cmath>
#define DIM 3502
#define LSB(x) (x & (-x))
#define x first
#define y second.x
#define z second.second
using namespace std;

FILE *fin = freopen("cutii.in", "r", stdin);
FILE *fout = freopen("cutii.out", "w", stdout);

int N, T;
int aib[DIM][DIM];
pair <int, pair <int, int> > v[3510];

void Update(int, int);
int Query(int, int);
void Remove(int, int);

int main()
    {
        scanf("%d%d", &N, &T);

        while (T--)
        {
            for (int i = 1; i <= N; i++)
                scanf("%d%d%d", &v[i].x, &v[i].y, &v[i].z);

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

            int sol = 0;

            for (int i = 1; i <= N; i++)
            {
                int nr = Query(v[i].y, v[i].z) + 1;
                aib[v[i].y][v[i].z] = nr;
                Update(v[i].y, v[i].z);

                sol = max(sol, nr);
            }

            for (int i = 1; i <= N; i++)
                Remove(v[i].y, v[i].z);

            printf("%d\n", sol);
        }
    }

void Update(int a, int b)
{
    for (int i = a; i <= N; i += LSB(i))
        for (int j = b; j <= N; j += LSB(j))
            aib[i][j] = max(aib[i][j], aib[a][b]);
}

int Query(int a, int b)
{
    int sol = 0;

    for (int i = a - 1; i; i -= LSB(i))
        for (int j = b - 1; j; j -= LSB(j))
            sol = max(aib[i][j], sol);

    return sol;
}

void Remove(int a, int b)
{
    for (int i = a; i <= N; i += i & (-i))
        for (int j = b; j <= N; j += j & (-j))
            aib[i][j] = 0;
}