[关闭]
@MLEAutoMaton 2019-03-31T08:09:20.000000Z 字数 1229 阅读 596

【洛谷3865】 【模板】ST表

猫树


实测跑的比ST表快!!!

这个东西也是的,不会可以看我上一篇Blog

  1. /*
  2. mail: mleautomaton@foxmail.com
  3. author: MLEAutoMaton
  4. This Code is made by MLEAutoMaton
  5. */
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. #include<math.h>
  10. #include<algorithm>
  11. #include<queue>
  12. #include<set>
  13. #include<map>
  14. #include<iostream>
  15. using namespace std;
  16. #define ll long long
  17. #define re register
  18. #define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
  19. inline int gi()
  20. {
  21. int f=1,sum=0;char ch=getchar();
  22. while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  23. while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
  24. return f*sum;
  25. }
  26. const int N=500010;
  27. int lg[N],mx[21][N],pos[N<<2],a[N],n,m;
  28. void build(int o,int l,int r,int dep)
  29. {
  30. if(l==r)return (void)(pos[l]=o);
  31. int mid=(l+r)>>1;
  32. mx[dep][mid]=a[mid];
  33. for(int i=mid-1;i>=l;i--)
  34. mx[dep][i]=max(mx[dep][i+1],a[i]);
  35. mx[dep][mid+1]=a[mid+1];
  36. for(int i=mid+2;i<=r;i++)
  37. mx[dep][i]=max(mx[dep][i-1],a[i]);
  38. build(o<<1,l,mid,dep+1);
  39. build(o<<1|1,mid+1,r,dep+1);
  40. }
  41. int query(int l,int r)
  42. {
  43. if(l==r)return a[l];
  44. int dep=lg[pos[l]]-lg[pos[l]^pos[r]];
  45. return max(mx[dep][l],mx[dep][r]);
  46. }
  47. int main()
  48. {
  49. n=gi();m=gi();
  50. for(int i=1;i<=n;i++)a[i]=gi();
  51. int L=2;
  52. while(L<n)L<<=1;
  53. for(int i=2;i<=L<<1;i++)lg[i]=lg[i>>1]+1;
  54. build(1,1,L,1);
  55. while(m--){int l=gi(),r=gi();printf("%d\n",query(l,r));}
  56. return 0;
  57. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注