Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i , j) for(int i = 0 ; i < j ; i ++)
  4. #define REPNM(i , j , k) for(int i = j ; i < k ; i ++)
  5. #define ALL(i) i.begin() , i.end()
  6. #define RI(i) scanf("%d" , &i)
  7. #define RII(i , j) scanf("%d%d" , &i , &j)
  8. #define DBGG(i , j) cout << i << " " << j << endl;
  9. #define pb push_back
  10. #define MAX 100090
  11. class Q{
  12. public:
  13. int ty , l , r , k; /// or [ at , k , +- 1]
  14. };
  15. Q q[MAX * 3];
  16. int n , m , ans[MAX * 3] , bit[MAX * 3];
  17.  
  18. int query(int now){
  19. int tmp = 0;
  20. for(int i = now ; i > 0 ; i -= (i & -i)) tmp += bit[i];
  21. return tmp;
  22. }
  23. void update(int k , int v){
  24. for(int i = k ; i < MAX * 3 ; i += (i & -i)) bit[i] += v;
  25. }
  26. void Solve(int l , int r , vector<int> sol){
  27.  
  28. vector<int> lthing , rthing;
  29.  
  30. int mid = (l + r) / 2;
  31. if(l == r){
  32. for(auto i : sol) if(q[i].ty)ans[i] = l;
  33. return ;
  34. }
  35. for(auto i : sol){
  36. if(q[i].ty == 0){
  37. if(q[i].r <= mid) update(q[i].l , q[i].k) , lthing.pb(i);
  38. else rthing.pb(i);
  39. }
  40. else {
  41. int tmp = query(q[i].r) - query(q[i].l - 1);
  42. // DBGG(l , r);
  43. // cout << "mid = " << mid << "\ttmp = " << tmp << endl;
  44. if(tmp >= q[i].k) lthing.pb(i);
  45. else rthing.pb(i) , q[i].k -= tmp;
  46. }
  47. }
  48. for(auto i : lthing)
  49. if(q[i].ty == 0) update(q[i].l , -q[i].k);
  50.  
  51. Solve(l , mid , lthing);
  52. Solve(mid + 1 , r , rthing);
  53. }
  54. int po , x[MAX];
  55. void ADDQ(int typ , int a , int b , int c){ // ty == 0 modify : ty == 1 query
  56. q[po].ty = typ;
  57. q[po].l = a;
  58. q[po].r = b;
  59. q[po].k = c;
  60. po++;
  61. }
  62. // [ at , k , +- 1]
  63. vector<int> uni;
  64. int main(){
  65.  
  66. RII(n , m);
  67.  
  68. int tmp , tma , tmb;
  69. char qc;
  70.  
  71. REPNM(i , 1 , n + 1)
  72. RI(x[i]) , uni.pb(x[i]) , ADDQ(0 , i , x[i] , 1);
  73.  
  74. REP(i , m){
  75. getchar();
  76. scanf("%c" , &qc);
  77. if(qc == 'Q'){
  78. scanf("%d%d%d" , &tmp , &tma , &tmb);
  79. ADDQ(1 , tmp , tma , tmb);
  80. }
  81. else {
  82. scanf("%d%d" , &tmp , &tma);
  83. ADDQ(0 , tmp , x[tmp] , -1);
  84. ADDQ(0 , tmp , tma , 1);
  85. x[tmp] = tma;
  86. uni.pb(tma);
  87. }
  88. }
  89. // DBGG("po = " , po);
  90.  
  91. sort(ALL(uni));
  92. uni.resize(unique(ALL(uni)) - uni.begin());
  93.  
  94. REP(i , po)
  95. if(q[i].ty == 0)
  96. q[i].r = lower_bound(ALL(uni) , q[i].r) - uni.begin();
  97.  
  98.  
  99. vector<int> sol;
  100. REP(i , po) sol.pb(i);
  101.  
  102. Solve(0 , uni.size() , sol);
  103.  
  104. REP(i , po)
  105. if(q[i].ty)printf("%d\n" , uni[ans[i]]);
  106. return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement