Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. #define INF 100000000
  6.  
  7. using namespace std;
  8.  
  9. vector<pair<int,int>> t;
  10.  
  11. void build_tree(int v, int tl, int tr, vector<int> a){
  12. if(tl==tr)
  13. t[v]=make_pair(a[tl], 1);
  14. else{
  15. int tm=(tl+tr)/2;
  16. build_tree(v*2, tl, tm, a);
  17. build_tree(v*2+1, tm+1, tr, a);
  18.  
  19. if(t[v*2].first==t[v*2+1].first){
  20. t[v]=make_pair(t[v*2].first, (t[v*2].second + t[v*2+1].second));
  21. }
  22. else{
  23. if(t[v*2].first > t[v*2+1].first){
  24. t[v]=make_pair(t[v*2].first, t[v*2].second);
  25. }
  26. else{
  27. t[v]=make_pair(t[v*2+1].first, t[v*2+1].second);
  28. }
  29. }
  30. }
  31. }
  32. /*
  33. int sum (int v, int tl, int tr, int l, int r) {
  34. if (l > r)
  35. return 0;
  36. if (l == tl && r == tr)
  37. return t[v];
  38. int tm = (tl + tr) / 2;
  39. return sum (v*2, tl, tm, l, min(r,tm))
  40. + sum (v*2+1, tm+1, tr, max(l,tm+1), r);
  41. }
  42. */
  43.  
  44. pair<int,int> num_max (int v, int tl, int tr, int l, int r) {
  45. if (l > r)
  46. return make_pair(-INF, 0);
  47. if (l == tl && r == tr)
  48. return t[v];
  49. int tm = (tl + tr) / 2;
  50.  
  51. pair<int,int> p1,p2;
  52.  
  53. p1=num_max(v*2, tl, tm, l, min(r,tm));
  54. p2=num_max(v*2+1, tm+1, tr, max(l,tm+1), r);
  55.  
  56. if(p1.first==p2.first){
  57. return(make_pair(p1.first, (p1.second + p2.second)));
  58. }
  59. else{
  60. if(p1.first > p2.first){
  61. return(make_pair(p1.first, p1.second));
  62. }
  63. else{
  64. return(make_pair(p2.first, p2.second));
  65. }
  66. }
  67. }
  68.  
  69.  
  70. void update (int v, int tl, int tr, int pos, int new_val) {
  71. if (tl == tr)
  72. t[v] = make_pair(new_val, 1);
  73. else {
  74. int tm = (tl + tr) / 2;
  75. if (pos <= tm)
  76. update (v*2, tl, tm, pos, new_val);
  77. else
  78. update (v*2+1, tm+1, tr, pos, new_val);
  79.  
  80. pair<int,int> p1=t[v*2],p2=t[v*2+1];
  81.  
  82. if(p1.first==p2.first){
  83. t[v]=make_pair(p1.first, (p1.second + p2.second));
  84. }
  85. else{
  86. if(p1.first > p2.first){
  87. t[v]=(make_pair(p1.first, p1.second));
  88. }
  89. else{
  90. t[v]=(make_pair(p2.first, p2.second));
  91. }
  92. }
  93. }
  94. }
  95.  
  96. int main(){
  97. int n;
  98. cin>>n;
  99. vector<int> a;
  100. t.resize(4*n,make_pair(0,0));
  101. for(int i=0;i<n;i++){
  102. int b;cin>>b;
  103. a.push_back(b);
  104. }
  105. build_tree(1,0,n-1,a);
  106. // for(int i=0;i<t.size();i++){
  107. // cout<<t[i]<<'\n';
  108. // }
  109. int m;
  110. cin>>m;
  111. for(int i=0;i<m;i++){
  112. char ch;
  113. cin>>ch;
  114. int a,b;
  115. cin>>a>>b;
  116. if(ch=='s')
  117. cout<<num_max(1,0,n-1,a-1,b-1).second<<" ";
  118. if(ch=='u')
  119. update(1,0,n-1,a-1,b);
  120. }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement