sacgajcvs

Untitled

Oct 13th, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. template <typename T>
  5. class Fenwick{
  6. public:
  7. vector<T> bit;
  8. Fenwick(int size):bit(size+1){}
  9. void add(int id,T val){
  10. for(;id<bit.size();id|=(id+1))
  11. bit[id]+=val;
  12. }
  13. T sum(int id){
  14. T res={0};
  15. for(;id>=0;id=(id&(id+1))-1)
  16. res+=bit[id];
  17. return res;
  18. }
  19. };
  20. int main(){
  21. ios_base::sync_with_stdio(false);
  22. cin.tie(0);
  23. cout.tie(0);
  24. int n,q;
  25. cin>>n>>q;
  26. vector<int> a;
  27. vector<int> v(n+1);
  28. for(int i=0;i<n;i++){
  29. int x;
  30. cin>>x;
  31. v[i]=x;
  32. a.push_back(x);
  33. }
  34. vector<pair<int,pair<int,int>> >query(q);
  35. for(int i=0;i<q;i++){
  36. char c;
  37. cin>>c;
  38. if(c=='C'){
  39. int l,r,x;
  40. cin>>l>>r>>x;
  41. l--;
  42. r--;
  43. query[i]={x,{l,r}};
  44. a.push_back(x);
  45. }else{
  46. int id,x;
  47. cin>>id>>x;
  48. id--;
  49. query[i]={-1,{id,x}};
  50. a.push_back(x);
  51. }
  52. }
  53. sort(a.begin(), a.end());
  54. a.resize(unique(a.begin(), a.end())-a.begin());
  55. map<int,int> m;
  56. int k=1;
  57. for(int i:a)
  58. m[i]=k++;
  59. int sq=n;
  60. sq/=log2(k);
  61. sq=sqrt(sq);
  62. vector<Fenwick<long long> > ft((n+sq-1)/sq,Fenwick<long long>(k+1));
  63. for(int i=0;i<n;i++){
  64. int block=i/sq;
  65. ft[block].add(m[v[i]],1);
  66. }
  67. for(auto p:query){
  68. if(p.first>0){
  69. int l=p.second.first,r=p.second.second,x=p.first;
  70. long long ans=0;
  71. int x1=m[x];
  72. if(l/sq==r/sq){
  73. for(int i=l;i<=r;i++)
  74. ans+=(v[i]<=x);
  75. cout<<ans<<endl;
  76. continue;
  77. }
  78. int l1=((l+sq-1)/sq)*sq,r1=(r/sq)*sq;
  79. for(int i=l;i<l1;i++)
  80. ans+=(v[i]<=x);
  81. for(;l1<r1;l1+=sq)
  82. ans+=ft[l1/sq].sum(x1);
  83. for(int i=r1;i<=r;i++)
  84. ans+=(v[i]<=x);
  85. cout<<ans<<endl;
  86. }
  87. else{
  88. int i=p.second.first,x=p.second.second;
  89. int block=i/sq;
  90. ft[block].add(m[v[i]],-1);
  91. v[i]=x;
  92. ft[block].add(m[v[i]],1);
  93. }
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment