记录编号 540688 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012] 永无乡 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 C++ 运行时间 0.701 s
提交时间 2019-08-27 23:34:50 内存使用 23.40 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cctype>
  3. #include<algorithm>
  4. #include<ext/pb_ds/assoc_container.hpp>
  5. #include<ext/pb_ds/tree_policy.hpp>
  6. int read()
  7. {
  8. int x=0,f=1;char ch=getchar();
  9. while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
  10. while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
  11. return x*f;
  12. }
  13. const int N=1e5+7;
  14. using namespace __gnu_pbds;
  15. int imp[N],fa[N];
  16. void init_set(int n)
  17. {
  18. for(int i=1;i<=n;++i) fa[i]=i;
  19. }
  20. int find(int x)
  21. {
  22. if (fa[x]!=x) return fa[x]=find(fa[x]);
  23. return fa[x];
  24. }
  25.  
  26. void uni_set(int x,int y)
  27. {
  28. x=find(x),y=find(y); fa[x]=y;
  29. }
  30. typedef tree<int,int,std::greater<int>,rb_tree_tag,
  31. tree_order_statistics_node_update> Tree;
  32. Tree block[N];
  33. void init_tree(int n)
  34. {
  35. for(int i=1;i<=n;++i)
  36. block[find(i)].insert(std::pair<int,int>(imp[i],i));
  37. }
  38.  
  39. void uni_tree(int x,int y)
  40. {
  41. x=fa[x],y=fa[y];
  42. if(x==y) return;
  43. int size_x=block[x].size(),size_y=block[y].size();
  44. if(size_x>size_y)std::swap(x,y);
  45. Tree::point_iterator it=block[x].begin();
  46. for(;it!=block[x].end();++it)
  47. {
  48. block[y].insert(std::pair<int,int>(it->first,it->second));
  49. block[x].erase(it);
  50. }
  51. uni_set(x,y);
  52. }
  53. int main()
  54. {
  55. freopen("bzoj_2733.in","r",stdin);
  56. freopen("bzoj_2733.out","w",stdout);
  57. int n=read(),m=read();init_set(n);
  58. for(int i=1;i<=n;++i) imp[i]=read();
  59. for(int i=0;i<m;++i) uni_set(read(),read());
  60. init_tree(n);
  61. int Q=read();
  62. char opt[5];
  63. while (Q--)
  64. {
  65. scanf("%s",opt);
  66. if(opt[0]=='B') uni_tree(read(),read());
  67. else
  68. {
  69. int father=find(read());
  70. int k=read();
  71. if(k>block[father].size()) puts("-1");
  72. else printf("%d\n",block[father].find_by_order(block[father].size()-k)->second);
  73. }
  74. }
  75. return 0;
  76. }