Cod sursa(job #1712078)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 1 iunie 2016 22:40:15
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <algorithm>
using namespace std;

const int MAX_N = 3500;

int n, t;
int aib[MAX_N + 1][MAX_N + 1];

struct box
{
    int x, y, z;
}v[MAX_N + 1];

int lsb(int a)
{
    return a & (-a);
}

bool cmp(box a, box b)
{
    return a.x < b.x;
}

void update(int a, int b, int val)
{
    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], val);
}

int query(int a, int b)
{
    int sol = 0;
    for(int i = a; i >= 1; i -= lsb(i))
        for(int j = b; j >= 1; j -= lsb(j))
            sol = max(sol, aib[i][j]);
    return sol;
}

void clean(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] = 0;
}

int main()
{
    FILE *fin, *fout;

    fin = fopen("cutii.in", "r");
    fout = fopen("cutii.out", "w");

    fscanf(fin, "%d %d", &n, &t);

    for(int j = 1; j <= t; j++)
    {
        for(int i = 1; i <= n; i++)
            fscanf(fin, "%d%d%d", &v[i].x, &v[i].y, &v[i].z);
        sort(v + 1, v + n + 1, cmp);
        for(int i = 1; i <= n; i++)
        {
            int l = query(v[i].y - 1, v[i].z - 1);
            update(v[i].y, v[i].z, l + 1);
        }
        fprintf(fout, "%d\n", query(n, n));
        for(int i = 1; i <= n; i++)
            clean(v[i].y, v[i].z);
    }



    return 0;
}