首页 > 代码库 > 树状数组

树状数组

  1. #include <vector>
  2. #include <queue>
  3. #include <stack>
  4. #include <set>
  5. #include <map>
  6. #include <algorithm>
  7. #include <iostream>
  8. #include <stdio.h>
  9. #include <string.h>
  10. using namespace std;
  11. #define MAXN 200020
  12. #define MAX(a,b) (a>b?a:b)
  13. #define Lowbit(x) (x & (-x))
  14. int num[MAXN]={0,3,1,2,4,5,8,7,9,6};//注意从下标为1的位置开始保存数据
  15. int C[MAXN];
  16. int Query(int l,int r){
  17. int ans=num[r];
  18. while(true){
  19. ans=MAX(ans,num[r]);
  20. if(r==l) break;
  21. for(r-=1;r-l>=Lowbit(r);r-=Lowbit(r)){
  22. ans=MAX(ans,C[r]);
  23. }
  24. }
  25. return ans;
  26. }
  27. void Modify(int p,int val,int end){
  28. num[p]=val;
  29. for(int i=p;i<=end;i+=Lowbit(i)){
  30. C[i]=val;
  31. for(int j=1;j<Lowbit(i);j<<=1){
  32. C[i]=MAX(C[i],C[i-j]);
  33. }
  34. }
  35. }
  36. int main(int argc, char *argv[])
  37. {
  38. int n,m;
  39. char op[3];
  40. int s,e;
  41. while(scanf("%d%d",&n,&m)!=EOF){
  42. memset(C,0,sizeof(C));
  43. memset(num,0,sizeof(num));
  44. for(int i=1;i<=n;i++){
  45. scanf("%d",&num[i]);
  46. Modify(i,num[i],n);
  47. }
  48. while(m--){
  49. scanf("%s%d%d",op,&s,&e);
  50. if(op[0]==‘Q‘)
  51. printf("%d\n",Query(s,e));
  52. else
  53. Modify(s,e,n);
  54. }
  55. }
  56. }



来自为知笔记(Wiz)


附件列表

     

    树状数组