Please subscribe to the official Codeforces channel in Telegram via the link https://t.me/codeforces_official. ×

 
 
 
 
General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
128875666 Practice:
Alex_Wei
1051G - 10 C++14 (GCC 6-32) Accepted 1871 ms 187624 KB 2021-09-15 09:47:32 2021-09-15 09:47:32
→ Source
#include<bits/stdc++.h>
using namespace std;

#define db double
#define ll long long
#define ld long double
#define ull unsigned long long

#define pii pair <int, int>
#define fi first
#define se second
#define pb push_back
#define mem(x, v, s) memset(x, v, sizeof(x[0]) * (s))
#define cpy(x, y, s) memcpy(x, y, sizeof(x[0]) * (s))

const int N = 2e5 + 5;

int node, R[N], ls[N << 5], rs[N << 5], sz[N << 5];
ll val[N << 5], sum[N << 5];
void push(int x) {
	val[x] = val[ls[x]] + val[rs[x]] + sum[ls[x]] * sz[rs[x]];
	sum[x] = sum[ls[x]] + sum[rs[x]], sz[x] = sz[ls[x]] + sz[rs[x]];
}
void ins(int l, int r, int p, int &x) {
	if(!x) x = ++node;
	if(l == r) return sz[x]++, sum[x] += p, void();
	int m = l + r >> 1;
	if(p <= m) ins(l, m, p, ls[x]);
	else ins(m + 1, r, p, rs[x]);
	push(x);
}
int merge(int l, int r, int x, int y) {
	if(!x || !y) return x | y;
	assert(l != r);
	int m = l + r >> 1;
	ls[x] = merge(l, m, ls[x], ls[y]);
	rs[x] = merge(m + 1, r, rs[x], rs[y]);
	return push(x), x;
}

ll n, ans, a[N], b[N], f[N], l[N], tot[N];
int find(int x) {return f[x] == x ? x : f[x] = find(f[x]);}
ll cal(int x) {
	ll res = l[x] * sum[R[x]] - tot[x];
	return res + val[R[x]];
}
void UFS(int x, int y, bool tp) {
	if(x >= N || y >= N) return;
	x = find(x), y = find(y);
	if(x == y || (!R[x] || !R[y]) && !tp) return;
	ans -= cal(x), ans -= cal(y);
	f[y] = x, l[x] = min(l[x], l[y]), tot[x] += tot[y];
	R[x] = merge(1, n, R[x], R[y]);
	ans += cal(x);
}
int main(){
	cin >> n;
	for(int i = 1; i < N; i++) f[i] = l[i] = i;
	for(int i = 1; i <= n; i++) {
		cin >> a[i] >> b[i];
		int p = find(a[i]);
		ans -= cal(p), ins(1, n, b[i], R[p]), tot[p] += a[i] * b[i];
		ans += cal(p);
		if(sz[R[p]] == 1) UFS(p, a[i] - 1, 0), UFS(p, a[i] + 1, 0);
		else UFS(p, l[p] + sz[R[p]] - 1, 1), UFS(p, l[p] + sz[R[p]], 0);
		cout << ans << endl;
	}
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details