Pagini recente » Cod sursa (job #2285479) | Cod sursa (job #1782610) | Cod sursa (job #2822131) | Cod sursa (job #810748) | Cod sursa (job #197680)
Cod sursa(job #197680)
#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;
}