Cod sursa(job #227186)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 3 decembrie 2008 21:34:19
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>
#include <math.h>
#include <algorithm>

using namespace std;

#define MAXN 3500

long test, n, t, i, j, k, sol, x, cut[3][MAXN], v[MAXN], aib[MAXN][MAXN];

bool cmp(long x, long y) {
    return cut[2][x] < cut[2][y];
}

inline long LSB(long num);
inline long query(long x, long y);
inline void update(long x, long y, long k);

int main() {
	freopen("cutii.in", "r", stdin);
    freopen("cutii.out", "w", stdout);
    scanf("%ld %ld", &n, &t);
    for (test = 1; test <= t; ++test) {
        sol = 0; 
        for (i = 1; i <= n; v[i] = i, ++i) {
            scanf("%ld %ld %ld", &cut[0][i], &cut[1][i], &cut[2][i]);
		}
        for (i = 0; i <= n; ++i) {
            for (j = 0; j <= n; ++j) {
                aib[i][j] = 0;
			}
		}
		sort(v + 1, v + n + 1, cmp);
		for (i = 1; i <= n; ++i) {
			x = query(cut[0][v[i]] - 1, cut[1][v[i]] - 1) + 1;
			if (x > sol) {
				sol = x;
			}
			update(cut[0][v[i]], cut[1][v[i]], x);
		}
		printf("%ld\n", sol);
	}
    return 0;
}

inline long LSB(long num) {
	return num ^ (num & (num - 1));
}
inline long query(long x, long y) {
    long ret = 0;
    for (long i = x; i > 0; i -= LSB(i)) {
		for (long j = y; j > 0; j -= LSB(j)) {
            if (ret < aib[i][j]) {
				ret = aib[i][j];
			}
		}
	}
    return ret; 
}
inline void update(long x, long y, long k) {
	for (long i = x; i <= n; i += LSB(i)) {
		for (long j = y; j <= n; j += LSB(j)) {
			if (aib[i][j] < k) {
				aib[i][j] = k;
			}
		}
	}
}