#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define rep(i,a,b) for(int i = (a); i<(b); i++)
#define ls(i) (i<<1)
#define rs(i) ((i<<1)|1)
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
using namespace std;
const int maxn = 100000;
int n;
int w[maxn+1],h[maxn+1];
int prv[maxn+1],nxt[maxn+1];
int f[maxn+1],sw[maxn+1];
 
class SegmentTreeMinPointUpdate
{
	const static int oo = (int) 1e9+10;
	const static int maxn = (int) 1e6;
	int n;
	int l[maxn*5],r[maxn*5],it[maxn*5],vt[maxn+1];
 
public:
	SegmentTreeMinPointUpdate(int n = 1) { this->n = n; initIT(1,1,n); }
	void initIT(int i,int x,int y)
	{
		l[i] = x; r[i] = y; it[i] = oo; 
		if (x==y) { vt[x] = i; return; }
		int m = (x+y)>>1;
		initIT(ls(i),x,m);
		initIT(rs(i),m+1,y);
	}
 
	void updatePoint(int x,int v)
	{
		it[vt[x]] = v;
		int tmp = vt[x]>>1;
		while (tmp>0) {
			it[tmp] = min(it[ls(tmp)],it[rs(tmp)]);
			tmp>>=1;
			
		}
	}
 
	int getIT(int i,int x,int y)
	{
		if (y<l[i] or x>r[i])
			return oo;
		if (x<=l[i] and r[i]<=y)
			return it[i];
		int res1 = getIT(ls(i),x,y), res2 = getIT(rs(i),x,y);
		return min(res1,res2);
	}
};
 
 
class SegmentTreeMaxPointUpdate
{
	const static int oo = (int) 1e9+10;
	const static int maxn = (int) 1e6;
	int n;
	int l[maxn*5],r[maxn*5],it[maxn*5],vt[maxn+1];
 
public:
	SegmentTreeMaxPointUpdate(int n = 1) { this->n = n; initIT(1,1,n); }
	void initIT(int i,int x,int y)
	{
		l[i] = x; r[i] = y;
		if (x==y) { vt[x] = i; return; }
		int m = (x+y)>>1;
		initIT(ls(i),x,m);
		initIT(rs(i),m+1,y);
	}
 
	void updatePoint(int x,int v)
	{
		it[vt[x]] = v;
		int tmp = vt[x]>>1;
		while (tmp>0) {
			it[tmp] = max(it[ls(tmp)],it[rs(tmp)]);
			tmp>>=1;
		}
	}
 
	int getIT(int i,int x,int y)
	{
		if (y<l[i] or x>r[i])
			return 0;
		if (x<=l[i] and r[i]<=y)
			return it[i];
		int res1 = getIT(ls(i),x,y), res2 = getIT(rs(i),x,y);
		return max(res1,res2);
	}
};
 
int index(vector<int>& v,int x)
{
	return distance(v.begin(),lower_bound(v.begin(),v.end(),x))+1;
}
 
const int oo = (int) 1e9+10;
SegmentTreeMaxPointUpdate prvTree; 
SegmentTreeMinPointUpdate nxtTree;
void process()
{
	vector<int> posH;
	rep(i,1,n+1) {
		posH.pb(h[i]);
		posH.pb(h[i]+1);
	}
	posH.pb(oo);
	
	sort(posH.begin(),posH.end());
	posH.erase(unique(all(posH)),posH.end());
 
	nxtTree.initIT(1,1,sz(posH));
	prvTree.initIT(1,1,sz(posH));
 
	prvTree.updatePoint(index(posH,oo),0);
 
	rep(i,1,n+1) {
		prv[i] = prvTree.getIT(1,index(posH,h[i]+1),sz(posH));
		prvTree.updatePoint(index(posH,h[i]),i);
	}
 
	nxtTree.updatePoint(index(posH,oo),n+1);
	for (int i=n; i>=1; i--) {
		nxt[i] = nxtTree.getIT(1,index(posH,h[i]+1),sz(posH));
		assert(h[i] >= h[nxt[i]-1]);
		nxtTree.updatePoint(index(posH,h[i]),i);
	}
}
 
int minPos;
int dp[maxn+1];
bool between(int x,int y,int z) { return min(x,z)<=y and y<=max(x,z); }
int fillTo(int x,int y,int H) { 
	int res = (sw[y]-sw[x-1])*H - (f[y]-f[x-1]); 
	return res;
}
int caldp(int x)
{
	if (dp[x]!=-1) return dp[x];
	
	if (x==minPos)
		dp[x] = 0;
	if (x<minPos)
		dp[x] = fillTo(x,nxt[x]-1,h[x])+caldp(min(minPos,nxt[x]));
	if (x>minPos)
		dp[x] = fillTo(prv[x]+1,x,h[x])+caldp(max(minPos,prv[x]));
 
	//cerr << "dp " << x << ' ' << dp[x] << '\n';
	return dp[x];
}
main()
{
	ios_base::sync_with_stdio(0);
	cin >> n;
	rep(i,1,n+1) {
		cin >> w[i] >> h[i];
		f[i]=f[i-1]+w[i]*h[i];
		sw[i]=sw[i-1]+w[i];
	}
	process();
	
	minPos = 1;
	rep(i,2,n+1) if (h[i] < h[minPos]) minPos = i;
	rep(i,1,n+1) assert(prv[i] < i and i < nxt[i]);
	
	memset(dp,-1,sizeof(dp));
	rep(i,1,n+1) {
		if (between(prv[i],minPos,nxt[i])) {
			cout << fillTo(prv[i]+1,nxt[i]-1,h[i]+1) << '\n';
			continue;
		}
 
		if (i < minPos) {
			assert(h[i] >= h[prv[i]+1]);
			assert(h[i] >= h[nxt[i]-1]); 
			cout << fillTo(prv[i]+1,nxt[i]-1,h[i]+1) + caldp(nxt[i]) << '\n';
		}
		if (i > minPos) {
			assert(h[i] >= h[prv[i]+1]);
			assert(h[i] >= h[nxt[i]-1]);
			cout << fillTo(prv[i]+1,nxt[i]-1,h[i]+1) + caldp(prv[i]) << '\n';
		}
	}
 
	return 0;
}