Advertisement
Guest User

Untitled

a guest
Jun 29th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. #include<set>
  2. #include <unordered_set>
  3. #include <unordered_map>
  4. #include<map>
  5. #include<list>
  6. #include<iomanip>
  7. #include<cmath>
  8. #include<string>
  9. #include<vector>
  10. #include<queue>
  11. #include<stack>
  12. #include<complex>
  13. #include<sstream>
  14. #include<iostream>
  15. #include<fstream>
  16. #include<algorithm>
  17. #include<numeric>
  18. #include<utility>
  19. #include<functional>
  20. #include<stdio.h>
  21. #include<assert.h>
  22. #include<memory.h>
  23. #include<bitset>
  24. #include<math.h>
  25. #include <string.h>
  26. #include <strings.h>
  27.  
  28.  
  29. #define f first
  30. #define s second
  31. #define mp make_pair
  32. #define pb push_back
  33. #define lp(i,a,n) for(int i=(a);i<=(int)(n);++i)
  34. #define lpd(i,a,n) for(int i=(a);i>=(int)(n);--i)
  35. #define clr(a,b) memset(a,b,sizeof a)
  36. #define all(v) v.begin(),v.end()
  37. #define println(a) cout <<(a) <<endl
  38. #define sz(x) ((int)(x).size())
  39. #define readi(x) scanf("%d",&x)
  40. #define read2i(x,y) scanf("%d%d",&x,&y)
  41. #define read3i(x,y,z) scanf("%d%d%d",&x,&y,&z)
  42. #define readll(x) scanf("%I64d",&x)
  43. #define mod 1000000007
  44. #define eps 1e-10
  45. #define infi 1000000000ll
  46. #define infll 1000000000000000000ll
  47.  
  48.  
  49. using namespace std;
  50. typedef long long ll;
  51. typedef pair<int, int> pii;
  52. typedef pair<ll, ll> pll;
  53. typedef vector<int> vi;
  54. typedef vector<vi> vvi;
  55. typedef vector<ll> vll;
  56. typedef set<int> si;
  57. typedef unordered_set<int> usi;
  58. typedef map<int,int> mii;
  59. typedef map<ll,ll> mll;
  60. typedef unordered_map<ll,ll> umll;
  61.  
  62. const int N = 250005 , A = 50002;
  63.  
  64. int n,q,a[N],tree[2][A],x[N],y[N],lastEdit[N];
  65. vector<pii> qIndex[N];
  66. pii queriesAns[N],curArr[N];
  67. struct query {
  68. int cur,prev,i;
  69. };
  70. vector<query> prevQueries;
  71.  
  72. void update(int i,int diff,int tree[]) {
  73. while (i < A) tree[i] += diff , i += i&-i;
  74. }
  75.  
  76. int getSum (int i,int tree[]) {
  77. int ret = 0;
  78. while (i > 0) ret += tree[i] , i -= i&-i;
  79. return ret;
  80. }
  81.  
  82. int main(){
  83. scanf("%d",&n);
  84. lp(i, 1, n) scanf("%d",&a[i]),update(a[i], 1, tree[0]);
  85.  
  86. scanf("%d",&q);
  87. lp(i, 1, q) {
  88. scanf("%d%d",&x[i],&y[i]);
  89. qIndex[x[i]].pb({y[i],i});
  90. }
  91.  
  92. ll ans = 0;
  93.  
  94. lpd(i, n, 1) {
  95. update(a[i], -1, tree[0]);
  96.  
  97. curArr[i] = {getSum(A-2,tree[0])-getSum(a[i], tree[0]),getSum(a[i]-1, tree[1])};
  98.  
  99. for(pii x:qIndex[i])
  100. queriesAns[x.s] = {getSum(A-2, tree[0])-getSum(x.f, tree[0]),getSum(x.f-1, tree[1])};
  101.  
  102. ans += curArr[i].s;
  103. update(a[i], 1, tree[1]);
  104. }
  105.  
  106. lp(i, 1, q) {
  107.  
  108. // lp(j, 0, sz(prevQueries)-1) if(prevQueries[j].i == x[i]) {
  109. // prevQueries.erase(prevQueries.begin()+j);
  110. // break;
  111. // }
  112.  
  113. pii &temp1 = curArr[x[i]], &temp2 = queriesAns[i];
  114.  
  115. lp(j, 0 , sz(prevQueries)-1) {
  116. query q = prevQueries[j];
  117. if(q.i > x[i]) {
  118. if(q.prev < a[x[i]] && q.cur >= a[x[i]] && j >= lastEdit[x[i]]) -- curArr[x[i]].s;
  119. if(q.prev < y[i] && q.cur >= y[i]) -- queriesAns[i].s;
  120.  
  121. if(q.prev >= a[x[i]] && q.cur < a[x[i]] && j >= lastEdit[x[i]]) ++ curArr[x[i]].s;
  122. if(q.prev >= y[i] && q.cur < y[i]) ++ queriesAns[i].s;
  123.  
  124. } else if(q.i < x[i]){
  125.  
  126. if(q.prev > a[x[i]] && q.cur <= a[x[i]] && j >= lastEdit[x[i]]) -- curArr[x[i]].f;
  127. if(q.prev > y[i] && q.cur <= y[i]) -- queriesAns[i].f;
  128.  
  129. if(q.prev <= a[x[i]] && q.cur > a[x[i]] && j >= lastEdit[x[i]]) ++ curArr[x[i]].f;
  130. if(q.prev <= y[i] && q.cur > y[i]) ++ queriesAns[i].f;
  131.  
  132. }
  133. }
  134.  
  135. ans += queriesAns[i].f-curArr[x[i]].f + queriesAns[i].s-curArr[x[i]].s;
  136.  
  137. printf("%lld\n",ans);
  138. curArr[x[i]] = queriesAns[i];
  139. prevQueries.pb({y[i],a[x[i]],x[i]});
  140. a[x[i]] = y[i];
  141. lastEdit[x[i]] = i;
  142. }
  143.  
  144. return 0;
  145. }
  146.  
  147.  
  148.  
  149. /*
  150. */
  151.  
  152. //ios::sync_with_stdio(0);cin.tie(0);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement