Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1. #include<algorithm>
  2. #include<vector>
  3. #include<cstring>
  4. #include<queue>
  5. #include<cstdio>
  6.  
  7. using namespace std;
  8.  
  9. #define MEM(a,b) memset(a,(b),sizeof(a))
  10. #define MP make_pair
  11. #define pb push_back
  12.  
  13. #define inf 1000000000
  14.  
  15. #define maxr 300000
  16.  
  17. typedef pair<int,int> pi;
  18. typedef vector<int> vi;
  19.  
  20. //typedef __int64 LL;
  21. typedef long LL;
  22.  
  23. int arr[100005];
  24. vi all[maxr];
  25.  
  26. void build(int node,int L,int R)
  27. {
  28. int i;
  29.  
  30. if(L==R)
  31. {
  32. all[node].pb(arr[L]);
  33. return;
  34. }
  35. int x=0,y=0,mid=(L+R)/2,p=node*2,q=node*2+1;
  36. build(node*2,L,mid);
  37. build(node*2+1,mid+1,R);
  38.  
  39. while(x<all[p].size() || y<all[q].size())
  40. {
  41. int a= x<all[p].size() ? all[p][x] : inf;
  42. int b= y<all[q].size() ? all[q][y] : inf;
  43. if(a<b)
  44. all[node].pb(a),x++;
  45. else
  46. all[node].pb(b),y++;
  47. }
  48. }
  49.  
  50.  
  51.  
  52. int kquery(int node,int L,int R,int LL,int RR,int K)
  53. {
  54. if(LL>R || RR<L) return 0;
  55. if(LL<=L && RR>=R)
  56. {
  57. int lo=0,hi=all[node].size()-1,ret=0;
  58.  
  59. while(lo<=hi)
  60. {
  61. int mid=(lo+hi)/2;
  62.  
  63.  
  64. if(all[node][mid]<=K)
  65. ret=mid+1,lo=mid+1;
  66. else
  67. hi=mid-1;
  68. }
  69. return ret;
  70. }
  71.  
  72. int mid=(L+R)/2;
  73. int p1=kquery(node*2,L,mid,LL,RR,K);
  74. int p2=kquery(node*2+1,mid+1,R,LL,RR,K);
  75.  
  76. return p1+p2;
  77. }
  78.  
  79.  
  80.  
  81. int main()
  82. {
  83. int i,j,k,tests,cs=0,a,b,n,m;
  84.  
  85. scanf("%d%d",&n,&m);
  86. for(i=1;i<=n;i++)
  87. scanf("%d",&arr[i]);
  88.  
  89. build(1,1,n);
  90.  
  91. for(i=0;i<m;i++)
  92. {
  93. scanf("%d%d%d",&a,&b,&k);
  94. int lo=-1e9,hi=+1e9,ans;
  95.  
  96. while(lo<=hi)
  97. {
  98. int mid=(lo+hi)/2;
  99. int cnt=kquery(1,1,n,a,b,mid);
  100.  
  101. if(cnt<k)
  102. lo=mid+1;
  103. else
  104. ans=mid,hi=mid-1;
  105. }
  106.  
  107. printf("%d\n",ans);
  108.  
  109. }
  110.  
  111.  
  112. return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement