Cod sursa(job #197680)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 5 iulie 2008 13:50:26
Problema Reconst Scor 35
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 1.66 kb
#include <fstream>

using namespace std;

struct quest {
	int b, e, s;

	bool operator<(const quest &x) {
		return (b < x.b) || (b == x.b && e < x.e);
	}
};

const int NMAX = 2048;
const int INF = 0x3f3f3f3f;

int N, M, GN;
quest Q[NMAX];
int A[NMAX];
bool V[NMAX], B[NMAX];

void read(void) {
	ifstream fin("reconst.in");
	int i;

	fin >> N >> M;

	for (i = 0; i < M; ++i)
		fin >> Q[i].b >> Q[i].e >> Q[i].s;
	
	fin.close();
}

void update(int k, int v) {
	int i, j;
	
	--GN;

	for (i = k, j = 1; j <= i; ++j)
		if (V[j]) ++i;
	V[i] = true;
	A[i] = v;

	for (i = 0; i < M; ++i)
		if (!B[i]) {
			if (Q[i].b <= k && k <= Q[i].e) Q[i].s -= v;
			if (Q[i].b > k) --Q[i].b;
			if (Q[i].e >= k) --Q[i].e;
		}
	
	for (i = 0; i < M; ++i) {
		if (!B[i]) {
			if (Q[i].b == Q[i].e)
				B[i] = true,
				update(Q[i].b, Q[i].s);
		}
	}
}

void build(void) {
	int i, j, mn, v, poz;

	for (j = 0; j < M; ++j)
		if (Q[j].b == Q[j].e)
			B[j] = true,
			update(Q[j].b, Q[j].s);

	for (i = 1, GN = N; i <= GN; ++i) {
		
		mn = INF; poz = 0;

		for (j = 0; j < M; ++j)
			if (!B[j] && Q[j].b == i && mn > Q[j].e)
				mn = Q[j].e, v = Q[j].s, poz = j;

		if (mn == INF) continue;

		for (j = 0; j < M; ++j)
			if (!B[j] && Q[j].b == i && Q[j].e > mn) {

				Q[j].b = mn + 1;
				Q[j].s -= v;
				if (Q[j].b == Q[j].e)
					B[j] = true,
					update(Q[j].b, Q[j].s);
			}

		if (Q[poz].e == i)
			B[poz] = true,
			update(i, Q[poz].s);

		for (j = 0; j < M; ++j)
			if (!B[j] && Q[j].b == i)
				++Q[j].b;
		
	}
}

void write(void) {
	ofstream fout("reconst.out");
	int i;

	for (i = 1; i <= N; ++i)
		fout << A[i] << ' ';
	fout << '\n';

	fout.close();
}

int main(void) {

	read();

	build();

	write();

	return 0;
}