Cod sursa(job #1466521)

Utilizator greenadexIulia Harasim greenadex Data 29 iulie 2015 12:58:48
Problema Cutii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second
#define pii pair<int, int>
#define mp make_pair

using namespace std;

const string name = "cutii",
             in_file = name + ".in",
             out_file = name + ".out";

ifstream fin(in_file);
ofstream fout(out_file);

const int MAX = 3501;

struct cutie {
	int y, z;

	cutie() {}

	cutie (int y, int z) {
		this->y = y;
		this->z = z;
	}

} v[MAX];

int aib[MAX][MAX], t, n, dp[MAX], sol;

int lsb(int x){
	return x & (-x);
}

int query(int a, int b){
	int sol = 0;
	for (int i = a; i >= 1; i -= lsb(i))
		for (int j = b; j >= 1; j -= lsb(j))
			sol = max(aib[i][j], sol);	
	return sol;	
}

void update(int a, int b, int val){
	for (int i = a; i <= n; i += lsb(i))
		for (int j = b; j <= n; j += lsb(j))
			aib[i][j] = max (aib[i][j], val);
}

void reset(int a, int b){
	for (int i = a; i <= n; i += lsb(i))
		for (int j = b; j <= n; j += lsb(j))
			aib[i][j] = 0;
}

int main() {
	fin >> n >> t;
	for (int x, y, z; t; t--){
		sol = 0;

		for (int i = 1; i <= n; i++){
			fin >> x >> y >> z;
			v[x] = cutie(y, z);
		}

		for (int i = 1; i <= n; i++){
			int temp = 1 + query(v[i].y - 1, v[i].z - 1);
			sol = max(sol, temp);
			update(v[i].y, v[i].z, sol);
		}

		for (int i = 1; i <= n; i++)
			reset(v[i].y, v[i].z);

		fout << sol << '\n';
	}


	return 0;
}