Source Code
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include <unordered_map>
//#include"testlib.h"
#define endl '\n'
#define all(v) v.begin(),v.end()
#define allr(s) s.rbegin(),s.rend()
#define RT(s) return cout<<s,0
#define sz(s)    (int)(s.size())
//#define PI acos(-1)
#define EPS 1e-8
#define watch(x) cout << (#x)<<" = "<<x<<endl
#define mk(x, y) make_pair(x, y)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
int dy[] = { 1, -1, 0, 0, -1, 1, 1, -1 };
int dx[] = { 0, 0, 1, -1, 1, -1, 1, -1 };
void file() {
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
#else
	//freopen("gcd.in", "r", stdin);
	//freopen("out.txt", "w", stdout);
#endif
}

void fast() {
	std::ios_base::sync_with_stdio(0);
	cin.tie(NULL);
}
const int N = 1e5 + 3;
vector<ii> adjL[N];
int a[N], n;
ll d[N];
int main() {
	file();
	fast();
	int q; cin >> n >> q;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	while (q--) {
		int u, b, c; cin >> u >> b >> c;
		adjL[u].push_back({ b, c });
	}
	for (int i = 1; i <= n; i++)
		d[i] = LLONG_MAX;
	set<int> nodes;
	for (int i = 2; i <= n; i++)
		nodes.insert(i);
	deque<int> st, tmp;
	vi hold_nodes;
	auto add_up = [&](int u) {
		vi hold;
		for (auto& ra : adjL[u]) {
			while (true) {
				auto it = nodes.lower_bound(max(u + 1, ra.first));
				if (it == nodes.end() || *it > ra.second) break;
				int v = *it;
				hold.push_back(*it);
				hold_nodes.push_back(*it);
				nodes.erase(it);
				d[v] = min(d[v], d[u] + abs(a[u] - a[v]));
				tmp.push_back(v);
				st.push_back(v);
			}
		}
		for (auto& it : hold)
			nodes.insert(it);
	};
	auto add_down = [&](int u) {
		vi hold;
		for (auto& ra : adjL[u]) {
			while (true) {
				auto it = nodes.upper_bound(min(u - 1, ra.second));
				if (it == nodes.begin()) break;
				it--;
				int v = *it;
				if (v < ra.first) break;
				hold.push_back(*it);
				hold_nodes.push_back(*it);
				nodes.erase(it);
				d[v] = min(d[v], d[u] + abs(a[u] - a[v]));
				tmp.push_back(v);
				st.push_back(v);
			}
		}
		for (auto& it : hold)
			nodes.insert(it);
	};

	st.push_back(1);
	d[1] = 0;
	for (int bit = 0; sz(st); bit = (bit + 1) & 1) {
		while (sz(st)) {
			int num = st.back();
			st.pop_back();
			//watch(num);
			if (!bit) add_up(num);
			else add_down(num);
			if (!bit) tmp.push_back(num);
		}
		for (auto& it : hold_nodes)
			nodes.erase(it);
		hold_nodes.clear();
		st = tmp;
		tmp.clear();
	}
	for (int i = 1; i <= n; i++)
		cout << (d[i] == LLONG_MAX ? -1 : d[i]) << ' ';
	cout << endl;
	return 0;
}
Copy
Fallout: New Vegas karemo
GNU G++17
1102 ms
81.6 MB
Time Limit Exceeded