Zung_the_great

hacker rank sorted segment trees

Jun 22nd, 2016
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.03 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define X first
  3. #define Y second
  4. #define For(i,a,b) for(int i=a; i<=b; i++)
  5. #define Ford(i,a,b) for(int i=a; i>=b; i--)
  6. #define assign(fi,fo) {freopen(fi,"r",stdin); freopen(fo,"w",stdout);}
  7. using namespace std;
  8. const int sz=75000;
  9. int n, Q, k, Count, ii;
  10. int z[sz+1], a[sz+1], b[sz+1];
  11. int f[(sz+1)*8],cnt[(sz+1)*8];
  12. pair<int, int>q[sz+1];
  13. void gen(int node, int l, int r){
  14. if(l==r)cnt[node]=b[l]; else{
  15. gen(node*2,l,(l+r)/2);
  16. gen(node*2+1,(l+r)/2+1,r);
  17. cnt[node]=cnt[node*2]+cnt[node*2+1];
  18. }
  19. }
  20. void search(int node, int l, int r, int L, int R){
  21. if(f[node]!=-1){
  22. cnt[node]=f[node];
  23. if(f[node])f[node*2]=(l+r)/2-l+1; else f[node*2]=0;
  24. if(f[node])f[node*2+1]=r-(l+r)/2; else f[node*2+1]=0;
  25. f[node]=-1;
  26. }
  27. if(l>R||r<L)return; else
  28. if(L<=l&&r<=R){
  29. Count+=cnt[node];
  30. //cout<<"This is "<<node<<" "<<cnt[node]<<"\n";
  31. }else{
  32. search(node*2,l,(l+r)/2,L,R);
  33. search(node*2+1,(l+r)/2+1,r,L,R);
  34. cnt[node]=cnt[node*2]+cnt[node*2+1];
  35. }
  36. }
  37. void build(int node, int l, int r, int L, int R){
  38. if(f[node]!=-1){
  39. cnt[node]=f[node];
  40. if(f[node])f[node*2]=(l+r)/2-l+1; else f[node*2]=0;
  41. if(f[node])f[node*2+1]=r-(l+r)/2; else f[node*2+1]=0;
  42. f[node]=-1;
  43. }
  44. if(l>R||r<L)return; else
  45. if(L<=l&&r<=R){
  46. cnt[node]=r-l+1;
  47. f[node*2]=(l+r)/2-l+1;
  48. f[node*2+1]=r-(l+r)/2;
  49. //cout<<" _ "<<node<<endl;
  50. }else{
  51. build(node*2,l,(l+r)/2,L,R);
  52. build(node*2+1,(l+r)/2+1,r,L,R);
  53. cnt[node]=cnt[node*2]+cnt[node*2+1];
  54. }
  55. }
  56. void build1(int node, int l, int r, int L, int R){
  57. if(f[node]!=-1){
  58. cnt[node]=f[node];
  59. if(f[node])f[node*2]=(l+r)/2-l+1; else f[node*2]=0;
  60. if(f[node])f[node*2+1]=r-(l+r)/2; else f[node*2+1]=0;
  61. f[node]=-1;
  62. }
  63. if(l>R||r<L)return; else
  64. if(L<=l&&r<=R){
  65. cnt[node]=0;
  66. f[node*2]=0;
  67. f[node*2+1]=0;
  68. //cout<<" "<<node<<endl;
  69. }else{
  70. build1(node*2,l,(l+r)/2,L,R);
  71. build1(node*2+1,(l+r)/2+1,r,L,R);
  72. cnt[node]=cnt[node*2]+cnt[node*2+1];
  73. }
  74. }
  75. void find(int node, int l, int r){
  76. if(f[node]!=-1){
  77. cnt[node]=f[node];
  78. if(f[node])f[node*2]=(l+r)/2-l+1; else f[node*2]=0;
  79. if(f[node])f[node*2+1]=r-(l+r)/2; else f[node*2+1]=0;
  80. f[node]=-1;
  81. }
  82. if(l==r){
  83. if(l==k)ii=cnt[node];
  84. }else{
  85. find(node*2,l,(l+r)/2);
  86. find(node*2+1,(l+r)/2+1,r);
  87. }
  88. }
  89.  
  90. void Solve(const int pos){
  91. int x=z[pos]; //cout<<" "<<z[pos]<<endl;
  92. memset(f,-1,sizeof(f));
  93. For(i,1,n)if(a[i]>x)b[i]=0;else b[i]=1;
  94. gen(1,1,n);
  95. For(i,1,Q){
  96. Count=0;
  97. search(1,1,n,q[i].X,q[i].Y);
  98. build(1,1,n,q[i].X,q[i].X+Count-1);
  99. build1(1,1,n,q[i].X+Count,q[i].Y);
  100. //printf("%d %d %d\n",q[i].X,q[i].Y,Count);
  101. }
  102. find(1,1,n);
  103. }
  104. int main(){
  105. assign("inp.inp","out.out");
  106. scanf("%d%d%d",&n,&Q,&k); k++;
  107. For(i,1,n){
  108. scanf("%d",&z[i]);
  109. a[i]=z[i];
  110. }
  111. For(i,1,Q){
  112. scanf("%d%d",&q[i].X,&q[i].Y);
  113. q[i].X++; q[i].Y++;
  114. }
  115. sort(z+1,z+1+n);
  116. int res, l=1, r=n, mid;
  117. while(l<=r){
  118. mid=(l+r)/2;
  119. Solve(mid);
  120. if(ii){
  121. res=mid; //cout<<"find\n";
  122. r=mid-1;
  123. }else l=mid+1;
  124. //return 0;
  125. }
  126. cout<<z[res]<<endl;
  127. return 0;
  128. }
Add Comment
Please, Sign In to add comment