#include #include #include using namespace std; using namespace atcoder; using mint = modint1000000007; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf 1000000000 int N; vector P; vector A; vector ans; void check(vector> X,vector> Y){ rep(i,X.size()){ if(X[i].first == Inf)continue; int ok = -1,ng = Y.size(); while(ng-ok>1){ int mid = (ok+ng)/2; bool f = true; if(Y[mid].first < X[i].first)f=false; if(Y[mid].second+X[i].second > A[X[i].first-1])f=false; if(f)ok = mid; else ng = mid; } ans[X[i].first-1] += ok+1; } } void dfs(int l,int r){ //cout<=P[l])ans[P[l]-1]++; return; } if(r-l==0)return; int m = (l+r)/2; // cout<> R(1,make_pair(P[m],P[m])); for(int i=m+1;i> L(1,make_pair(P[m-1],P[m-1])); for(int i=m-2;i>=l;i--){ L.emplace_back(min(L.back().first,P[i]),L.back().second + P[i]); } //cout<>N; P.resize(N),A.resize(N),ans.resize(N,0); rep(i,N){ scanf("%d",&P[i]); } rep(i,N){ scanf("%lld",&A[i]); } dfs(0,N); rep(i,N){ printf("%lld\n",ans[i]); } return 0; }