fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxN=2e5;
  5. int bit[maxN*3+1];// 紀錄每個薪水的數量
  6. int arr[maxN];
  7. struct Data{
  8. char c;
  9. int a, b;
  10. }dt[maxN];
  11. vector<int> v; // 離散化
  12. int N, Q;
  13.  
  14. void update(int x,int v){
  15. for(; x<=maxN*3;x+=(x&(-x)) )
  16. bit[x]+=v;
  17. }
  18. int query(int x){
  19. int ans=0;
  20. for(; x>0;x-=(x&(-x)) )
  21. ans+=bit[x];
  22. return ans;
  23. }
  24.  
  25. int main() {
  26. cin>>N>>Q;
  27. for(int i=0;i<=maxN*3;i++)
  28. bit[i]=0;
  29.  
  30. for(int i=0;i<N;i++){
  31. cin>>arr[i];
  32. v.push_back(arr[i]);
  33. }
  34.  
  35. for(int i=0;i<Q;i++){
  36. cin>>dt[i].c>>dt[i].a>>dt[i].b;
  37. if( dt[i].c=='!' )
  38. v.push_back(dt[i].b);
  39. else{
  40. v.push_back(dt[i].a);
  41. v.push_back(dt[i].b);
  42. }
  43. }
  44. v.push_back(-1);
  45. sort(v.begin(),v.end() );
  46. v.erase( unique(v.begin(),v.end()),v.end() );
  47.  
  48. for(int i=0;i<N;i++){
  49. int p=lower_bound(v.begin(),v.end(),arr[i])-v.begin();
  50. update(p,1);
  51. }
  52.  
  53. for(int i=0;i<Q;i++){
  54. if( dt[i].c=='?' ){
  55. int p1=lower_bound(v.begin(),v.end(),dt[i].a)-v.begin();
  56. int p2=lower_bound(v.begin(),v.end(),dt[i].b)-v.begin();
  57. cout<<query(p2)-query(p1-1)<<'\n';
  58. }
  59. else{
  60. int p1=lower_bound(v.begin(),v.end(),arr[dt[i].a-1])-v.begin();
  61. int p2=lower_bound(v.begin(),v.end(),dt[i].b)-v.begin();
  62. arr[dt[i].a-1]=dt[i].b;
  63. update(p1,-1);
  64. update(p2,1);
  65. }
  66. }
  67. }
Success #stdin #stdout 0.01s 8836KB
stdin
10 10
9 9 1 4 3 2 10 1 2 1
? 1 5
? 3 9
? 2 5
! 5 1
? 2 5
? 2 4
? 3 10
? 2 6
? 7 7
? 3 7
stdout
7
4
4
3
3
4
3
0
1