Advertisement
a53

fsecv_0P

a53
Jun 6th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. /// https://www.geeksforgeeks.org/array-range-queries-elements-frequency-value/
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. int block;
  5. struct Query
  6. {
  7. int L,R,index;
  8. };
  9.  
  10. bool compare(Query x, Query y)
  11. {
  12. if (x.L / block != y.L / block)
  13. return x.L / block < y.L / block;
  14. return x.R < y.R;
  15. }
  16.  
  17. void add(int x,int &currentAns,
  18. unordered_map<int,int>&freq)
  19. {
  20. ++freq[x];
  21. if(freq[x]==(x+1))
  22. --currentAns;
  23. else
  24. if(freq[x]==x)
  25. ++currentAns;
  26. }
  27.  
  28. void remove(int x,int &currentAns,unordered_map<int,int> &freq)
  29. {
  30. --freq[x];
  31. if(freq[x]==x)
  32. ++currentAns;
  33. else
  34. if(freq[x]==(x-1))
  35. --currentAns;
  36. }
  37.  
  38. void queryResultsUtil(int a[],Query q[],int ans[],int m)
  39. {
  40. unordered_map<int,int> freq;
  41. int currL=0,currR=0;
  42. int currentAns=0;
  43. for(int i=0;i<m;++i)
  44. {
  45. int L=q[i].L,R=q[i].R;
  46. int index=q[i].index;
  47. while (currL < L)
  48. {
  49. remove(a[currL],currentAns,freq);
  50. ++currL;
  51. }
  52.  
  53. while(currL>L)
  54. {
  55. --currL;
  56. add(a[currL],currentAns,freq);
  57. }
  58. while(currR<=R)
  59. {
  60. add(a[currR],currentAns,freq);
  61. ++currR;
  62. }
  63. while(currR>R+1)
  64. {
  65. --currR;
  66. remove(a[currR],currentAns,freq);
  67. }
  68. ans[index]=currentAns;
  69. }
  70. }
  71.  
  72. void queryResults(int a[],int n,Query q[],int m)
  73. {
  74. block=(int)sqrt(n);
  75. sort(q,q+m,compare);
  76. int* ans=new int[m];
  77. queryResultsUtil(a,q,ans,m);
  78. ofstream g("fsecv.out");
  79. for(int i=0;i<m;++i)
  80. g<<ans[i]<<'\n';
  81. }
  82.  
  83. int main()
  84. {
  85. int n,q,A[100000];
  86. ifstream f("fsecv.in");
  87. f>>n>>q;
  88. for(int i=0;i<n;++i)
  89. f>>A[i];
  90. Query queries[100000];
  91. for(int i=0;i<q;++i)
  92. f>>queries[i].L>>queries[i].R>>queries[i].index;
  93. queryResults(A,n,queries,q);
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement