a53

fsecv_ANDU

a53
Jun 10th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define NMAX 100005
  3. using namespace std;
  4. ifstream fin("fsecv.in");
  5. ofstream fout("fsecv.out");
  6. int block, N, Q, a[NMAX], answers[NMAX], current_answer; ///ASA PROGRAMUL ESTE OK, DAR INEFICIENT ...
  7. /// POATE REUSESTI TU ......
  8. /// NU ARATA CORECT current_answer .... IN REST FACE PERFECT FRECVENTA PE INTEROGARE ....
  9. struct Query
  10. {
  11. int L, R, index, k; /// index ESTE NR. DE ORDINE A INTEROGARII, IAR k ESTE VALOAREA CU CARE TREBUIE COMPARATA FRECVENTA ...
  12. };
  13.  
  14. Query queries[NMAX];
  15. unordered_map<int, int>freq; /// PENTRU FRECVENTA
  16. bool compare(Query x, Query y) /// PENTRU SORTAREA INTEROGARILOR CONFORM INDICATIILOR ........
  17. {
  18. if(x.L / block != y.L / block)
  19. return x.L / block < y.L / block;
  20. return x.R < y.R;
  21. }
  22. inline void add(int x, int v) /// ASTA-I FUNCTIA DE ADAUGARE ....
  23. {
  24. freq[x]++;
  25. /** if(freq[x]==v) ACEASTA ESTE PARTEA CU CARE AR TREBUI FACUTA INLOCUIREA, DAR NU-I OK .....
  26. current_answer++;*/
  27. }
  28.  
  29. inline void remove(int x, int v) /// STERGEREA FRECVENTELOR x ESTE NUMARUL DIN INTEROGARE, IAR v ESTE k
  30. {
  31. freq[x]--;
  32. /** if(freq[x]==v) ACEASTA ESTE PARTEA CU CARE AR TREBUI FACUTA INLOCUIREA, DAR NU-I OK .....SI NU STIU CUM ....
  33. current_answer++;
  34. else if(freq[x]==v-1)
  35. current_answer--;*/
  36. }
  37.  
  38. int main()
  39. {
  40. fin>>N>>Q;
  41. for(int i=0; i<N; i++)
  42. fin>>a[i];
  43. for(int i=0; i<Q; i++)
  44. {
  45. fin>>queries[i].L>>queries[i].R>>queries[i].k;
  46. queries[i].L--; queries[i].R--;
  47. queries[i].index=i;
  48. }
  49. block = (int)sqrt(N);
  50. sort(queries, queries + Q, compare);
  51. int mo_left = 0, mo_right = -1;
  52.  
  53. for(int i = 0; i < Q; i++)
  54. {
  55. int left = queries[i].L;
  56. int right = queries[i].R;
  57. int val = queries[i].k;
  58. while(mo_right < right)
  59. {
  60. mo_right++;
  61. add(a[mo_right], val);
  62. }
  63. while(mo_right > right)
  64. {
  65. remove(a[mo_right], val);
  66. mo_right--;
  67. }
  68.  
  69. while(mo_left < left)
  70. {
  71. remove(a[mo_left], val);
  72. mo_left++;
  73. }
  74. while(mo_left > left)
  75. {
  76. mo_left--;
  77. add(a[mo_left], val);
  78. }
  79. /// ACESTA ESTE PARTEA CARE AR TREBUI INLOCUITA CA SA FIE EFICIENTA REZOLVAREA ....
  80. current_answer=0;
  81.  
  82. for(auto i : freq)
  83. if(i.second==val)
  84. current_answer++;
  85. /// PANA AICI ....
  86. answers[queries[i].index] = current_answer;
  87. }
  88. for(int i = 0; i < Q; i++)
  89. fout << answers[i] << "\n";
  90. return 0;
  91. }
Add Comment
Please, Sign In to add comment