#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, bool fi=true) { //printf("ofs %d %d\n",i,p); 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=1; j<=n; j++) if (is[j]) printf("%d,",j); puts(""); for (int j=0; jmxs)) continue; ofs(k,i,mxs,false); } } void ins(int i) { if (is[i]==it) return; is[i]=it; for (; i<=n; i=(i<<1)-(i&(i-1))) if (sit[i]!=it) { sit[i]=it; s[i]=1; } else s[i]++; } void dfs(int cur) { //printf("%d (%d %d) %d %d\n",cur,x[cur],y[cur],nx[cur],ny[cur]); if (nx[cur]!=0) { ++it; dfs(nx[cur]); ins(x[cur]); } if (ny[cur]!=0) { ++it; dfs(ny[cur]); } ins(y[cur]); //puts("--"); ofs(x[cur],y[cur],x[cur]+y[cur]); ins(x[cur]); } bool cmp(int i, int j) { return x[i]+y[i]=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; }