#include<iostream>
#include<cstdlib>
using namespace std;
#define int long long
inline int read(){
int i=getchar(),r=0;
while(i<'0'||i>'9')i=getchar();
while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar();
return r;
}
const int N=300100;
int ls[N],rs[N],pos[N],val[N],wei[N],siz[N];
int cnt,rt;
inline void push_up(int nd){siz[nd]=siz[ls[nd]]+siz[rs[nd]]+1;}
#define p1 first
#define p2 second
pair<int,int>split(int nd,int k){
if(!nd)return{0,0};
if(pos[nd]<=k){
pair<int,int>o=split(rs[nd],k);
rs[nd]=o.p1;push_up(nd);
return{nd,o.p2};
}
else{
pair<int,int>o=split(ls[nd],k);
ls[nd]=o.p2;push_up(nd);
return{o.p1,nd};
}
}
int merge(int u,int v){
if(!u||!v)return u|v;
if(wei[u]<wei[v]){
rs[u]=merge(rs[u],v);
push_up(u);
return u;
}
else{
ls[v]=merge(u,ls[v]);
push_up(v);
return v;
}
}
inline int New(int p,int k){
pos[++cnt]=p;
val[cnt]=k;
wei[cnt]=rand();
siz[cnt]=1;
return cnt;
}
void insert(int p,int k){
pair<int,int>o=split(rt,p);
rt=merge(o.p1,merge(New(p,k),o.p2));
}
inline int find(int k){
pair<int,int>o=split(rt,k);
pair<int,int>p=split(o.p1,k-1);
int res=p.p2;
rt=merge(merge(p.p1,p.p2),o.p2);
return res;
}
#undef p1
#undef p2
int ans;
signed main(){
// freopen("read.in","r",stdin);
int n;cin>>n;
while(n--){
int x=read(),y=read(),z=read();
int p=0,h1=0,h2=0,h3=0,h4=0;
p=find(x*1e9+y);
if(!p)insert(x*1e9+y,0),p=find(x*1e9+y);
if(x>1)h1=val[find((x-1)*1e9+y)]-val[p];
if(x<1e9)h2=val[find((x+1)*1e9+y)]-val[p];
if(y>1)h3=val[find(x*1e9+y-1)]-val[p];
if(y<1e9)h4=val[find(x*1e9+y+1)]-val[p];
// cout<<h1<<' '<<h2<<' '<<h3<<' '<<h4<<' ';
ans+=4*z;
if(h1>0)ans-=2*min(z,h1);
if(h2>0)ans-=2*min(z,h2);
if(h3>0)ans-=2*min(z,h3);
if(h4>0)ans-=2*min(z,h4);
val[p]+=z;
printf("%lld\n",ans);
}
return 0;
}
用map过的,想知道这个不到50的平衡树哪挂了qwq