Cod sursa(job #2953873)

Utilizator Pop_EmilPal Tamas Pop_Emil Data 12 decembrie 2022 14:45:22
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;

FILE *in = fopen("cutii.in", "r"), *out = fopen("cutii.out", "w");

#define MaxN 3505
int N, T, result;
int BIT[MaxN][MaxN];

struct Box {
    int dims[3];
} v[MaxN];

int query(int x, int y){
    int ML = 0;
    for(int i = x; i > 0; i -= i & (-i))
        for(int j = y; j > 0; j -= j & (-j))
            ML = max(ML, BIT[i][j]);
    return ML;
}

void update(int x, int y, int len){
    for(int i = x; i <= N; i += i & (-i))
        for(int j = y; j <= N; j += j & (-j))
            BIT[i][j] = max(len, BIT[i][j]);
}

void reset_BIT(int x, int y){
    for(int i = x; i <= N; i += i & (-i))
        for(int j = y; j <= N; j += j & (-j)){
            BIT[i][j] = 0;
    }
}

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

    int ML;
    while(T--) {

        for(int i = 1; i <= N; ++i)
            fscanf(in, "%d %d %d", &v[i].dims[0], &v[i].dims[1], &v[i].dims[2]);

        sort(v + 1, v + N + 1, [](Box a, Box b) { return a.dims[0] < b.dims[0]; });

        result = 1;
        for (int i = 1; i <= N; ++i){
            ML = query(v[i].dims[1] - 1, v[i].dims[2] - 1);
            update(v[i].dims[1], v[i].dims[2], ML + 1);
            if (ML + 1 > result)
                result = ML + 1;
        }

        fprintf(out, "%d\n", result);
        for (int i = 1; i <= N; ++i){
           reset_BIT(v[i].dims[1], v[i].dims[2]);
        }
        //memset(BIT, 0, sizeof(BIT));
    }
    return 0;
}