Cod sursa(job #2180577)

Utilizator flibiaVisanu Cristian flibia Data 20 martie 2018 22:55:43
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>

using namespace std;

FILE *out = fopen("trade.out", "w");

#define dim 100000
char buff[dim];
int p = 0;

void read(int &nr){
	nr = 0;
	while(buff[p] < '0' || buff[p] > '9')
		if(++p == dim) 
			fread(buff, 1, dim, stdin), p = 0;
	while(buff[p] >= '0' && buff[p] <= '9'){
		nr = 10 * nr + buff[p] - '0';
		if(++p == dim) 
			fread(buff, 1, dim, stdin), p = 0;
	}
}

struct seg{
	int st, dr, val;
	bool operator < (const seg& other) const {
		if(st < other.st)
			return val + other.st - st > other.val;
		return other.val + st - other.st < val;
	}
};

int n, m, sol[1000100], nxt[2000100];
seg S[300100];
set <int> h;
bitset <5000100> viz;

int find(int p){
	return (!viz[p] ? p : nxt[p] = find(nxt[p]));
}

int main(){
	freopen("trade.in", "r", stdin);
	cin >> n >> m;
	for(register int i = 1; i <= m; i++)
		read(S[i].st), read(S[i].dr), read(S[i].val);
	sort(S + 1, S + m + 1);
	for(register int i = 0; i <= n; i++)
		nxt[i] = i + 1;
	for(register int i = 1; i <= m; i++){
		for(register int p = S[i].st; p <= S[i].dr; p = nxt[p]){
			if(!viz[p]){
				sol[p] = p - S[i].st + S[i].val;
				viz[p] = 1;
			}
		}
		find(S[i].st);
	}
	for(register int i = 1; i <= n; i++)
		fprintf(out, "%d ", sol[i]);
	return 0;
}