Cod sursa(job #2620992)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 30 mai 2020 10:51:29
Problema Cutii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>
std::ifstream fin ("cutii.in");
std::ofstream fout ("cutii.out");

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

bool sortZ (Box a, Box b){
    return a.z < b.z;
}

class BIT_2D{

int **bit;
int size;

public:
    BIT_2D (int Size){
        size = Size;
        bit = new int*[size];
        for (int i=0; i<size; i++)
            bit[i] = new int[size];
        clear();
    }

    void clear (){
        for (int i=0; i<size; i++)
            for (int j=0; j<size; j++)
            bit[i][j] = 0;
    }

    void update (int x, int y, int val){
        int yy = y;
        while (x < size){
            y = yy;
            while (y < size){
                bit[x][y] = std::max (bit[x][y], val);
                y = (y | (y+1));
            }
            x = (x | (x+1));
        }
    }

    int query (int x, int y){
        int yy = y, ans = 0;
        while (x >= 0){
            y = yy;
            while (y >= 0){
                ans = std::max (ans, bit[x][y]);
                y = (y & (y+1)) - 1;
            }
            x = (x & (x+1)) - 1;
        }
        return ans;
    }

    int print (){
        for (int i=0; i<size; i++, fout << '\n')
            for (int j=0; j<size; j++)
            fout << bit[i][j] << ' ';
        fout << '\n';
    }
};

int main()
{
    int n, T, i;
    fin >> n >> T;

    while (T --){
        struct Box boxes[n];

        for (i=0; i<n; i++)
            fin >> boxes[i].x >> boxes[i].y >> boxes[i].z;
        std::sort (boxes, boxes+n, sortZ);

        BIT_2D bit(n+1);

        int ans = 0, crt;
        for (i=0; i<n; i++){
            crt = bit.query (boxes[i].x, boxes[i].y) + 1;
            bit.update (boxes[i].x, boxes[i].y, crt);
            //bit.print();
            ans = std::max (ans, crt);
        }

        fout << ans << '\n';
    }


    return 0;
}