Fahim_7861

mergesort tree kth sum kth number find

Jan 16th, 2021
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef pair<long long ,ll>pll;
  5. #define fastread() (ios_base:: sync_with_stdio(false),cin.tie(NULL));
  6. #define vll(v) v.begin(),v.end()
  7. #define F first
  8. #define S second
  9. #define pb push_back
  10. #define eb emplace_back
  11. #define sf(a) scanf("%d",&a)
  12.  
  13. const int Max = 1e5 + 10;
  14.  
  15. pair<int,int> ara[Max+10];
  16.  
  17. vector<int>tree[5*Max];
  18.  
  19. vector<long long>Sum[5*Max];
  20.  
  21. long long cum[Max+10];
  22.  
  23. int value[Max+2];
  24.  
  25. void build_tree(ll l, ll r, ll node)
  26. {
  27. if(l==r)
  28. {
  29. tree[node].pb(ara[l].S);
  30.  
  31. Sum[node]={0,ara[l].F};
  32.  
  33. return ;
  34. }
  35.  
  36. ll mid=(l+r)/2;
  37.  
  38. ll left=node*2,right=(node*2)+1;
  39.  
  40. build_tree(l,mid,left);
  41. build_tree(mid+1,r,right);
  42.  
  43. merge(tree[left].begin(),tree[left].end(),tree[right].begin(),tree[right].end(),back_inserter(tree[node]));
  44.  
  45. long long i,sum=0;
  46.  
  47. Sum[node].eb(0);
  48.  
  49. for(auto x : tree[node])
  50. {
  51. sum+=value[x];
  52.  
  53. Sum[node].eb(sum);
  54.  
  55. }
  56.  
  57. }
  58.  
  59.  
  60.  
  61. pll kthNumberSum(int node, int b, int e, int l, int r, int k)
  62. {
  63. if(b==e)
  64. return {Sum[node].back(),tree[node].back()};
  65.  
  66. ll Left=node*2;
  67. ll Right=Left+1;
  68. ll mid=(b+e)/2;
  69.  
  70. auto x=upper_bound(vll(tree[Left]),r)-tree[Left].begin();
  71.  
  72. auto t=lower_bound(vll(tree[Left]),l)-tree[Left].begin();
  73.  
  74. if(x-t>=k)
  75. return kthNumberSum(Left,b,mid,l,r,k);
  76.  
  77. else
  78. {
  79. pll ret= kthNumberSum(Right,mid+1,e,l,r,k-x+t);
  80.  
  81. ret.F+=Sum[Left][x]-Sum[Left][t];
  82.  
  83. return ret;
  84. }
  85. }
  86.  
  87. //find kth number with sum
  88.  
  89. //only kth number
  90.  
  91. /*
  92. ll kthNumber(int node, int b, int e, int l, int r, int k)
  93. {
  94. if(b==e)
  95. return tree[node].back();
  96.  
  97. ll Left=node*2;
  98. ll Right=Left+1;
  99. ll mid=(b+e)/2;
  100.  
  101. auto x=upper_bound(vll(tree[Left]),r)-lower_bound(vll(tree[Left]),l);
  102.  
  103. if(x>=k)
  104. return kthNumber(Left,b,mid,l,r,k);
  105.  
  106. else
  107. return kthNumber(Right,mid+1,e,l,r,k-x);
  108. }
  109.  
  110. */
  111.  
  112.  
  113. int main()
  114. {
  115. ll i,j,m,p,a,sum=0,k,t,b,c,d,cnt=0,l,r,ans=0;
  116.  
  117. int n,q;
  118. sf(n);
  119. sf(q);
  120.  
  121. for(i=1; i<=n; i++)
  122. {
  123. sf(ara[i].F);
  124.  
  125. ara[i].S=i;
  126.  
  127. value[i]=ara[i].F;
  128.  
  129. cum[i]=cum[i-1]+value[i];
  130. }
  131.  
  132. sort(ara+1,ara+n+1);
  133.  
  134. build_tree(1,n,1);
  135.  
  136. while(q--)
  137. {
  138. sf(l);
  139. sf(r);
  140.  
  141. k=(r-l+1)/2;
  142. k++;
  143.  
  144. ll total=r-l+1;
  145.  
  146. pll ans=kthNumberSum(1,1,n,l,r,k);
  147.  
  148. ans.S=value[ans.S];
  149.  
  150. long long sum=cum[r]-cum[l-1];
  151.  
  152. long long sum1=abs( (sum-ans.F)-(ans.S*(total-k)));
  153.  
  154. long long sum2=abs(ans.F-(k*ans.S));
  155.  
  156. printf("%lld\n",sum1+sum2);
  157. }
  158.  
  159.  
  160. }
  161.  
Add Comment
Please, Sign In to add comment