Cod sursa(job #623664)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 20 octombrie 2011 15:37:17
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

#define lbit(x) ((x&-x))
struct Cutie {
	int x, y, z;
};

class Compare {
	public:
	bool operator ()(Cutie a, Cutie b) {
		return a.z < b.z;
	}
};

vector <vector <int> > vect_aib;
vector <Cutie> vect_cutii;

int query(int x, int y);
void update(int x, int y, int val);

int main(void) {
	int n, m;
	ifstream fin("cutii.in");
	ofstream fout("cutii.out");
	Compare comparator = Compare();
	
	fin >> n >> m;
	vect_cutii.resize(n);
	vect_aib.resize(n+1, vector <int> (n+1)); 
	
	for(int i = 0; i < m; ++i) {
		for(int j = 0; j < n; ++j) 
			fin >> vect_cutii[j].x >> vect_cutii[j].y >> vect_cutii[j].z;
		
		vect_aib.assign(n+1, vector <int> (n+1, 0));
		sort(vect_cutii.begin(), vect_cutii.end(), comparator);
		
		int maxim = 0;
		for(int j = 0; j < n; ++j) {
			int prev_max = query(vect_cutii[j].x-1, vect_cutii[j].y-1);
			update(vect_cutii[j].x, vect_cutii[j].y, prev_max+1);
			maxim = max(maxim, prev_max);
		}
		fout << maxim + 1 << '\n';
	}
	
	fout.close();
	fin.close();	
}

int query(int x, int y) {
	int maxim = 0;
	for(int i = x; i > 0; i -= lbit(i)) 
		for(int j = y; j > 0; j -= lbit(j)) 
			maxim = max(maxim, vect_aib[i][j]);
	return maxim;
}

void update(int x, int y, int val) {
	for(int i = x; i < vect_aib.size(); i += lbit(i))
		for(int j = y; j < vect_aib.size(); j += lbit(j))
			vect_aib[i][j] = max(val, vect_aib[i][j]);
}