#include using namespace std; const int MX=100100; int n,i,cur,now,xc,yc,it,x[MX],y[MX],k[MX],nx[MX],ny[MX],w[MX],cnt[MX],p[MX],rk[MX],is[MX],s[MX],sit[MX]; vector g[MX]; long long r; void ofs(int i, int p, int mxs) { for (int j=n; j>0; j&=j-1) if (sit[j]==it) r+=s[j]; for (int j=mxs-i-1; j>0; j&=j-1) if (sit[j]==it) r-=s[j]; for (int j=0; j=rk[xc]) { p[xc]=now=yc; if (rk[yc]==rk[xc]) rk[yc]++; } else p[yc]=now=xc; if (cnt[w[yc]]>=cnt[w[xc]]) { nx[cur]=w[xc]; ny[cur]=w[yc]; } else { nx[cur]=w[yc]; ny[cur]=w[xc]; swap(x[cur],y[cur]); } cnt[cur]=cnt[w[xc]]+cnt[w[yc]]+1; w[now]=cur; } dfs(cur); printf("%lld\n",r); return 0; }