Submission #794558

#TimeUsernameProblemLanguageResultExecution timeMemory
794558rainboyRooted MST (innopolis2021_final_E)C11
100 / 100
545 ms89104 KiB
/* https://oj.uz/submission/418483 (gs14004) */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N	300000
#define N_	(1 << 19)	/* N_ = pow2(ceil(log2(N))) */
#define M	300000
#define W	1000000001
#define INF	0x3f3f3f3f3f3f3f3fLL

long long min(long long a, long long b) { return a < b ? a : b; }

unsigned int X = 12345;

int rand_() { 
	return (X *= 3) >> 1;
}

int xx[N], n;
int ii[M], jj[M], ww[M], m;

void sort(int *hh, int l, int r) {
	while (l < r) {
		int i = l, j = l, k = r, h = hh[l + rand_() % (r - l)], tmp;

		while (j < k)
			if (ww[hh[j]] == ww[h])
				j++;
			else if (ww[hh[j]] < ww[h]) {
				tmp = hh[i], hh[i] = hh[j], hh[j] = tmp;
				i++, j++;
			} else {
				k--;
				tmp = hh[j], hh[j] = hh[k], hh[k] = tmp;
			}
		sort(hh, l, i);
		l = k;
	}
}

int *ej[N], *ew[N], eo[N];

void append(int i, int j, int w) {
	int o = eo[i]++;

	if (o >= 2 && (o & o - 1) == 0) {
		ej[i] = (int *) realloc(ej[i], o * 2 * sizeof *ej[i]);
		ew[i] = (int *) realloc(ew[i], o * 2 * sizeof *ew[i]);
	}
	ej[i][o] = j, ew[i][o] = w;
}

int ds[N];

int find(int i) {
	return ds[i] < 0 ? i : find(ds[i]);
}

void join(int i, int j, int w) {
	i = find(i);
	j = find(j);
	if (i == j)
		return;
	if (ds[i] > ds[j])
		ds[i] = j, append(j, i, w);
	else {
		if (ds[i] == ds[j])
			ds[i]--;
		ds[j] = i, append(i, j, w);
	}
}

int qu[N], ta[N], ww_[N], cnt;

void dfs(int i) {
	int o;

	qu[ta[i] = cnt++] = i;
	for (o = 0; o < eo[i]; o++) {
		int j = ej[i][o], w = ew[i][o];

		ww_[cnt] = w, dfs(j);
	}
}

long long st[N_ * 2][2][2]; int n_;

void pul(int i) {
	int l = i << 1, r = l | 1, a, b, c;

	memset(st[i], 0x3f, sizeof st[i]);
	for (a = 0; a < 2; a++)
		for (b = 0; b < 2; b++)
			for (c = 0; c < 2; c++)
				st[i][a][c] = min(st[i][a][c], st[l][a][b] + st[r][b][c]);
}

void build() {
	int i;

	n_ = 1;
	while (n_ < n)
		n_ <<= 1;
	for (i = 0; i < n_; i++)
		if (i < n) {
			st[n_ + i][0][0] = ww_[i], st[n_ + i][0][1] = ww_[i] + xx[qu[i]];
			st[n_ + i][1][0] = 0, st[n_ + i][1][1] = min(ww_[i], xx[qu[i]]);
		} else {
			st[n_ + i][0][0] = 0, st[n_ + i][0][1] = INF;
			st[n_ + i][1][0] = INF, st[n_ + i][1][1] = 0;
		}
	for (i = n_ - 1; i > 0; i--)
		pul(i);
}

void update(int i, int x) {
	st[n_ + i][0][0] = ww_[i], st[n_ + i][0][1] = ww_[i] + x;
	st[n_ + i][1][0] = 0, st[n_ + i][1][1] = min(ww_[i], x);
	i += n_;
	while (i > 1)
		pul(i >>= 1);
}

int main() {
	static int hh[M];
	int q, h, h_, i, x;

	scanf("%d%d", &n, &m);
	for (i = 0; i < n; i++)
		scanf("%d", &xx[i]);
	for (h = 0; h < m; h++) {
		scanf("%d%d%d", &ii[h], &jj[h], &ww[h]), ii[h]--, jj[h]--;
		hh[h] = h;
	}
	sort(hh, 0, m);
	for (i = 0; i < n; i++) {
		ej[i] = (int *) malloc(2 * sizeof *ej[i]);
		ew[i] = (int *) malloc(2 * sizeof *ew[i]);
	}
	memset(ds, -1, n * sizeof *ds);
	for (h = 0; h < m; h++) {
		h_ = hh[h];
		join(ii[h_], jj[h_], ww[h_]);
	}
	for (i = 0; i < n; i++)
		join(i, i + 1, W);
	dfs(find(0));
	build();
	scanf("%d", &q);
	while (q--) {
		scanf("%d%d", &i, &x), i--;
		update(ta[i], x);
		printf("%lld\n", st[1][0][1]);
	}
	return 0;
}

Compilation message (stderr)

Main.c: In function 'append':
Main.c:47:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   47 |  if (o >= 2 && (o & o - 1) == 0) {
      |                     ~~^~~
Main.c: In function 'main':
Main.c:129:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  129 |  scanf("%d%d", &n, &m);
      |  ^~~~~~~~~~~~~~~~~~~~~
Main.c:131:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  131 |   scanf("%d", &xx[i]);
      |   ^~~~~~~~~~~~~~~~~~~
Main.c:133:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  133 |   scanf("%d%d%d", &ii[h], &jj[h], &ww[h]), ii[h]--, jj[h]--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.c:150:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  150 |  scanf("%d", &q);
      |  ^~~~~~~~~~~~~~~
Main.c:152:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  152 |   scanf("%d%d", &i, &x), i--;
      |   ^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...