Advertisement
jeff69

D div2 894

Nov 19th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. int n,m;
  5. const int MX = 1e6+6;
  6. vector<pair<int,int>> adj[MX];
  7. multiset<pair<int,int>> H[MX];
  8. pair < ll , ll > bit[10*MX];
  9. ll answer[MX];
  10. bool vis[MX];
  11. pair<ll,ll> get(int x)
  12. {
  13.     ll ret = 0,ret2=0;
  14.     while(x)
  15.     {
  16.         ret+=bit[x].first;
  17.         ret2+=bit[x].second;
  18.         x-=x&(-x);
  19.     }
  20.     return {ret,ret2};
  21. }
  22. void nig(int x,ll val)
  23. {
  24.     if(x==0)
  25.         return;
  26.     int dd = x;
  27.     while(x<10*MX)
  28.     {
  29.         bit[x].first+=val;
  30.         bit[x].second+=dd;
  31.         x+=x&(-x);
  32.     }
  33. }
  34. void dfs(int x,int pa,int dis,int CNT,int VAL)
  35. {
  36.     if(vis[x]||dis>1e7)
  37.         return;
  38.     for(auto u : adj[x])
  39.     {
  40.         if(u.first==pa||vis[u.first])continue;
  41.         dfs(u.first,x,dis+u.second,CNT,VAL);
  42.     }
  43.     nig(dis,VAL);
  44. }
  45. void dfs2(int x,int pa,int dis,int CNT,int VAL)
  46. {
  47.     if(vis[x]||dis>1e7)
  48.         return;
  49.     for(auto u : adj[x])
  50.     {
  51.         if(u.first==pa||vis[u.first])continue;
  52.         dfs2(u.first,x,dis+u.second,CNT,VAL);
  53.     }
  54.     for(auto u: H[x])
  55.     {
  56.         if(u.first-dis<0)continue;
  57.         answer[u.second] += get(u.first-dis).first*u.second - get(u.first-dis).second+1;
  58.     }
  59. }
  60. int main()
  61. {
  62.  
  63.     cin>>n>>m;
  64.     for(int i=1;i<=n;i++)
  65.     {
  66.         int L;scanf("%d",&L);
  67.         adj[(i+1)/2].push_back({i+1,L});
  68.     }
  69.     for(int i=1;i<=m;i++)
  70.     {
  71.         int h;scanf("%d",&h);
  72.         H[i].insert({h,i});
  73.     }
  74.     for(int cnt = 1;cnt<= n;cnt++){
  75.         if(adj[cnt].empty())continue;
  76.        auto u1  = adj[cnt][0];
  77.        pair < int , int > u2 = {0,0};
  78.        if(adj[cnt].size()>1)
  79.         u2 = adj[cnt][1];
  80.         dfs(u1.first,u1.second,1,cnt,1);
  81.         dfs2(u2.first,0,u2.second,0,cnt);
  82.         dfs(u1.first,u1.second,1,cnt,-1);
  83.         swap(u1,u2);
  84.         dfs(u1.first,u1.second,1,cnt,1);
  85.         dfs2(u2.first,0,u2.second,0,cnt);
  86.         dfs(u1.first,u1.second,1,cnt,-1);
  87.         vis[cnt] =1;
  88.     }
  89.     for(int i=1;i<=m;i++)
  90.     {
  91.         cout<<answer[i]<<'\n';
  92.     }
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement