Advertisement
a53

dss

a53
Jul 18th, 2019
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define N_MAX 400002
  3. #define Q_MAX 10002
  4. #define ll long long
  5. #define BUFFER_SIZE 1000002
  6.  
  7. using namespace std;
  8.  
  9. FILE* fin = fopen("dss.in", "r");
  10. ofstream fout ("dss.out");
  11.  
  12. char buffer[BUFFER_SIZE];
  13. int pos = -1;
  14.  
  15. void read_buffer ()
  16. {
  17. fread(buffer, sizeof(char), BUFFER_SIZE, fin);
  18. }
  19.  
  20. char read_char ()
  21. {
  22. pos++;
  23. if(pos == BUFFER_SIZE)
  24. {
  25. read_buffer();
  26. pos = 0;
  27. }
  28. return buffer[pos];
  29. }
  30.  
  31. int read_int ()
  32. {
  33. char c;
  34. while(!isdigit(c = read_char()));
  35. int ans = 0;
  36. while(isdigit(c))
  37. {
  38. ans = ans * 10 + c - '0';
  39. c = read_char();
  40. }
  41. return ans;
  42. }
  43.  
  44. const int MOD = 1e9+7;
  45.  
  46. int pwr (int a, int b)
  47. {
  48. if(b == 0)
  49. return 1;
  50. if(b & 1)
  51. return 1LL * pwr(a, (b ^ 1)) * a % MOD;
  52. int p = pwr(a, (b >> 1));
  53. return 1LL * p * p % MOD;
  54. }
  55.  
  56. int inv[N_MAX];
  57.  
  58. int opp[N_MAX], opm[N_MAX];
  59.  
  60. int n, q;
  61.  
  62. int bucketCount;
  63. int bucketSize;
  64.  
  65. int v[N_MAX];
  66.  
  67. struct Query
  68. {
  69. int l, r;
  70. int index;
  71. };
  72.  
  73. bool operator < (const Query &a, const Query &b)
  74. {
  75. return make_pair(a.l / bucketSize, a.r) < make_pair(b.l / bucketSize, b.r);
  76. }
  77.  
  78. Query queries[Q_MAX];
  79.  
  80. int freq[N_MAX];
  81.  
  82. int ans[N_MAX];
  83.  
  84. int main()
  85. {
  86. read_buffer();
  87. n = read_int();
  88. q = read_int();
  89. for(int i = 1; i <= n + 1; i++)
  90. inv[i] = pwr(i, MOD - 2);
  91. for(int i = 1; i <= n + 1; i++)
  92. opp[i] = 1LL * inv[i] * (i + 1) % MOD;
  93. for(int i = 0; i <= n; i++)
  94. opm[i] = 1LL * inv[i + 2] * (i + 1) % MOD;
  95. bucketCount = sqrt(q);
  96. bucketSize = n / bucketCount;
  97. for(int i = 1; i <= n; i++)
  98. v[i] = read_int();
  99. for(int i = 1; i <= q; i++)
  100. {
  101. queries[i].l = read_int();
  102. queries[i].r = read_int();
  103. queries[i].index = i;
  104. }
  105. sort(queries + 1, queries + q + 1);
  106. int l = 1, r = 0;
  107. int answer = 1;
  108. for(int i = 1; i <= q; i++)
  109. {
  110. while(l > queries[i].l)
  111. {
  112. l--;
  113. freq[v[l]]++;
  114. answer = 1LL * answer * opp[freq[v[l]]] % MOD;
  115. }
  116. while(r < queries[i].r)
  117. {
  118. r++;
  119. freq[v[r]]++;
  120. answer = 1LL * answer * opp[freq[v[r]]] % MOD;
  121. }
  122. while(l < queries[i].l)
  123. {
  124. freq[v[l]]--;
  125. answer = 1LL * answer * opm[freq[v[l]]] % MOD;
  126. l++;
  127. }
  128. while(r > queries[i].r)
  129. {
  130. freq[v[r]]--;
  131. answer = 1LL * answer * opm[freq[v[r]]] % MOD;
  132. r--;
  133. }
  134. ans[queries[i].index] = (1LL * answer - 1 + MOD) % MOD;
  135. }
  136. for(int i = 1; i <= q; i++)
  137. fout << ans[i] << "\n";
  138. return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement