Cod sursa(job #1987847)

Utilizator giotoPopescu Ioan gioto Data 1 iunie 2017 12:01:49
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n, t, aib[3505][3505];
struct cutie{
    int x, y, z;
}a[3502];
inline bool cmp(cutie a, cutie b){
    return a.z < b.z;
}
inline int query(int x, int y){
    int ans = 0;
    for(int i = x; i >= 1 ; i -= (i & (-i)))
        for(int j = y; j >= 1 ; j -= (j & (-j)))
            ans = max(ans, aib[i][j]);
    return ans;
}
inline void update(int x, int y, int val){
    for(int i = x; i <= n ; i += (i & (-i)))
        for(int j = y; j <= n ; j += (j & (-j)))
            aib[i][j] = max(aib[i][j], val);
}
inline void clear(){
    for(int i = 1; i <= n ; ++i)
        for(int x = a[i].x; x <= n ; x += (x & (-x)))
        for(int y = a[i].y; y <= n ; y += (y & (-y)))
        aib[x][y] = 0;
}
int main()
{
    freopen("cutii.in", "r", stdin);
    freopen("cutii.out", "w", stdout);
    scanf("%d%d", &n, &t);
    while(t--){
        for(int i = 1; i <= n ; ++i)
            scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);
        sort(a + 1, a + n + 1, cmp);
        int Sol = 0;
        for(int i = 1; i <= n ; ++i){
            int bst = query(a[i].x, a[i].y) + 1;
            update(a[i].x, a[i].y, bst);
            if(bst > Sol) Sol = bst;
        }
        clear();
        printf("%d\n", Sol);
    }
    return 0;
}