记录编号 340974 评测结果 AAAAAAAA
题目名称 大话西游 最终得分 100
用户昵称 Gravatarasddddd 是否通过 通过
代码语言 C++ 运行时间 1.239 s
提交时间 2016-11-07 09:39:37 内存使用 7.56 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <vector>
  7. #define maxn 100010
  8. #define lol long long
  9. using namespace std;
  10. int Basis[maxn],Segmin[4*maxn],Segmax[4*maxn],Pos[maxn],Mark[maxn],n,m,Cost[maxn],Size[maxn],Depth[maxn];
  11. char Ch[10];
  12. struct edge{
  13. int from,to;
  14. };
  15. edge Edge[maxn];
  16. vector<int>G[maxn];
  17. int sv=0;
  18. void addedge(int from,int to){
  19. G[from].push_back(to);
  20. G[to].push_back(from);
  21. }
  22. void build(int l,int r,int o){
  23. if(l==r){
  24. Segmax[o]=Segmin[o]=Basis[l];
  25. Pos[l]=o;
  26. return ;
  27. }
  28. int mid=(l+r)/2;
  29. build(l,mid,o<<1);
  30. build(mid+1,r,o<<1|1);
  31. Segmax[o]=max(Segmax[o<<1],Segmax[o<<1|1]);
  32. Segmin[o]=min(Segmin[o<<1],Segmin[o<<1|1]);
  33. return ;
  34. }
  35. int DFS(int u,int pa,int dep){
  36. Depth[u]=dep;
  37. Mark[u]=sv;
  38. Basis[sv]=Cost[u];
  39. sv++;
  40. int siz=0;
  41. for(int i=0;i<G[u].size();i++){
  42. int v=G[u][i];
  43. if(v!=pa){
  44. siz+=DFS(v,u,dep+1);
  45. }
  46. }
  47. Size[u]=siz;
  48. return siz+1;
  49. }
  50. void change(int a,int b){
  51. int k=Pos[Mark[a]];
  52. Segmax[k]=Segmin[k]=b;
  53. k>>=1;
  54. while(k!=0){
  55. Segmax[k]=max(Segmax[k<<1],Segmax[k<<1|1]);
  56. Segmin[k]=min(Segmin[k<<1],Segmin[k<<1|1]);
  57. k>>=1;
  58. }
  59. return;
  60. }
  61. void query(int l,int r,int o,int ll,int rr,lol &maxx,lol &minn){
  62. if(ll<=l&&rr>=r){
  63. maxx=max((int)maxx,Segmax[o]);
  64. minn=min((int)minn,Segmin[o]);
  65. return;
  66. }
  67. int mid=(l+r)/2;
  68. if(ll<=mid){
  69. query(l,mid,o<<1,ll,rr,maxx,minn);
  70. }
  71. if(rr>mid){
  72. query(mid+1,r,o<<1|1,ll,rr,maxx,minn);
  73. }
  74. return ;
  75. }
  76. void get_input(){
  77. scanf("%d%d",&n,&m);
  78. for(int i=1;i<=n;i++)
  79. scanf("%d",&Cost[i]);
  80. for(int i=0;i<n-1;i++){
  81. int from,to;
  82. scanf("%d%d",&from,&to);
  83. Edge[i].from=from;
  84. Edge[i].to=to;
  85. addedge(from,to);
  86. }
  87. DFS(1,-1,0);
  88. build(0,n-1,1);
  89. for(int i=0;i<m;i++){
  90. scanf("%s",Ch);
  91. if(Ch[0]=='C'){
  92. int a,b;
  93. scanf("%d%d",&a,&b);
  94. change(a,b);
  95. }
  96. else{
  97. lol minn1=999999999;lol minn2=999999999;
  98. lol maxx1=0;lol maxx2=0;
  99. int u;
  100. scanf("%d",&u);
  101. lol from=Edge[u-1].from,to=Edge[u-1].to;
  102. if(Depth[from]<Depth[to])
  103. swap(from,to);
  104. query(0,n-1,1,Mark[from],Mark[from]+Size[from],maxx1,minn1);
  105. if(Mark[from]!=0)
  106. query(0,n-1,1,0,Mark[from]-1,maxx2,minn2);
  107. if(Mark[from]+Size[from]!=n-1)
  108. query(0,n-1,1,Mark[from]+Size[from]+1,n-1,maxx2,minn2);
  109. lol asd=minn1*maxx1+minn2*maxx2;
  110. printf("%lld\n",asd);
  111. }
  112. }
  113. }
  114. int main(){
  115. freopen("westward.in","r",stdin);
  116. freopen("westward.out","w",stdout);
  117. ios::sync_with_stdio(false);
  118. get_input();
  119. }