Advertisement
IanisBelu

dss

Nov 23rd, 2023
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.41 KB | Source Code | 0 0
  1. #include <cstring>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <vector>
  5. #include <cmath>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. #define BUFF_SIZE 1000002
  11.  
  12. class OutParser {
  13. private:
  14.     FILE *fout;
  15.     char *buff;
  16.     int sp;
  17.  
  18.     void write_ch(char ch) {
  19.         if (sp == BUFF_SIZE) {
  20.             fwrite(buff, 1, BUFF_SIZE, fout);
  21.             sp = 0;
  22.             buff[sp++] = ch;
  23.         } else {
  24.             buff[sp++] = ch;
  25.         }
  26.     }
  27.  
  28.  
  29. public:
  30.     OutParser(const char* name) {
  31.         fout = fopen(name, "w");
  32.         buff = new char[BUFF_SIZE]();
  33.         sp = 0;
  34.     }
  35.     ~OutParser() {
  36.         fwrite(buff, 1, sp, fout);
  37.         fclose(fout);
  38.     }
  39.  
  40.     OutParser& operator << (int vu32) {
  41.         if (vu32 <= 9) {
  42.             write_ch(vu32 + '0');
  43.         } else {
  44.             (*this) << (vu32 / 10);
  45.             write_ch(vu32 % 10 + '0');
  46.         }
  47.         return *this;
  48.     }
  49.  
  50.     OutParser& operator << (long long vu64) {
  51.         if (vu64 <= 9) {
  52.             write_ch(vu64 + '0');
  53.         } else {
  54.             (*this) << (vu64 / 10);
  55.             write_ch(vu64 % 10 + '0');
  56.         }
  57.         return *this;
  58.     }
  59.  
  60.     OutParser& operator << (char ch) {
  61.         write_ch(ch);
  62.         return *this;
  63.     }
  64.     OutParser& operator << (const char *ch) {
  65.         while (*ch) {
  66.             write_ch(*ch);
  67.             ++ch;
  68.         }
  69.         return *this;
  70.     }
  71. };
  72.  
  73. class InParser {
  74. private:
  75.     FILE *fin;
  76.     char *buff;
  77.     int sp;
  78.  
  79.     char read_ch() {
  80.         ++sp;
  81.         if (sp == BUFF_SIZE) {
  82.             sp = 0;
  83.             fread(buff, 1, BUFF_SIZE, fin);
  84.         }
  85.         return buff[sp];
  86.     }
  87.  
  88. public:
  89.     InParser(const char* nume) {
  90.         fin = fopen(nume, "r");
  91.         buff = new char[BUFF_SIZE]();
  92.         sp = BUFF_SIZE - 1;
  93.     }
  94.    
  95.     InParser& operator >> (int &n) {
  96.         char c;
  97.         while (!isdigit(c = read_ch()) && c != '-');
  98.         int sgn = 1;
  99.         if (c == '-') {
  100.             n = 0;
  101.             sgn = -1;
  102.         } else {
  103.             n = c - '0';
  104.         }
  105.         while (isdigit(c = read_ch())) {
  106.             n = 10 * n + c - '0';
  107.         }
  108.         n *= sgn;
  109.         return *this;
  110.     }
  111.    
  112.     InParser& operator >> (long long &n) {
  113.         char c;
  114.         n = 0;
  115.         while (!isdigit(c = read_ch()) && c != '-');
  116.         long long sgn = 1;
  117.         if (c == '-') {
  118.             n = 0;
  119.             sgn = -1;
  120.         } else {
  121.             n = c - '0';
  122.         }
  123.         while (isdigit(c = read_ch())) {
  124.             n = 10 * n + c - '0';
  125.         }
  126.         n *= sgn;
  127.         return *this;
  128.     }
  129. };
  130.  
  131. #ifdef LOCAL
  132. InParser fin("input.txt");
  133. #define fout cout
  134. #else
  135. InParser fin("dss.in");
  136. OutParser fout("dss.out");
  137. #define endl '\n'
  138. #endif
  139.  
  140. const int NMAX = 4e5+5;
  141. const int QMAX = 1e4+5;
  142. const int MOD  = 1e9+7;
  143.  
  144. struct Query {
  145.     int l, r, idx;
  146. };
  147.  
  148. int n, m;
  149. int a[NMAX];
  150. int bucket[NMAX];
  151. Query q[QMAX];
  152. int fr[NMAX];
  153. int inv[NMAX];
  154. int qans[NMAX];
  155.  
  156. void read() {
  157.     fin >> n >> m;
  158.     for (int i = 1; i <= n; i++)
  159.         fin >> a[i];
  160.     for (int i = 1; i <= m; i++) {
  161.         fin >> q[i].l >> q[i].r;
  162.         q[i].idx = i;
  163.     }
  164. }
  165.  
  166. int pow(int a, int n) {
  167.     if(n == 0) return 1;
  168.     if(n & 1) return 1ll * pow(a, n ^ 1) * a % MOD;
  169.     int p = pow(a, n >> 1);
  170.     return 1ll * p * p % MOD;
  171. }
  172.  
  173. void precalc() {
  174.     int sq = n / sqrt(m);
  175.     for (int i = 1; i <= n; i++)
  176.         bucket[i] = (i - 1) / sq + 1;
  177.     sort(q + 1, q + m + 1, [](const Query &a, const Query &b) {
  178.         if (bucket[a.l] == bucket[b.l]) return a.r < b.r;
  179.         return a.l < b.l;
  180.     });
  181.     inv[1] = 1;
  182. }
  183.  
  184. int inv_mod(int x) {
  185.     if (inv[x]) return inv[x];
  186.     return inv[x] = pow(x, MOD - 2);
  187. }
  188.  
  189. void solve() {
  190.     int l = 1, r = 1;
  191.     fr[a[1]] = 1;
  192.     int ans = 2;
  193.     for (int i = 1; i <= m; i++) {
  194.         while (q[i].l < l) {
  195.             l--;
  196.             fr[a[l]]++;
  197.             ans = 1ull * ans * inv_mod(fr[a[l]]) * (fr[a[l]] + 1) % MOD;
  198.         }
  199.         while (r < q[i].r) {
  200.             r++;
  201.             fr[a[r]]++;
  202.             ans = 1ull * ans * inv_mod(fr[a[r]]) * (fr[a[r]] + 1) % MOD;
  203.         }
  204.         while (l < q[i].l) {
  205.             fr[a[l]]--;
  206.             ans = 1ull * ans * inv_mod(fr[a[l]] + 2) * (fr[a[l]] + 1) % MOD;
  207.             l++;
  208.         }
  209.         while (q[i].r < r) {
  210.             fr[a[r]]--;
  211.             ans = 1ull * ans * inv_mod(fr[a[r]] + 2) * (fr[a[r]] + 1) % MOD;
  212.             r--;
  213.         }
  214.         qans[q[i].idx] = (1ll * ans - 1 + MOD) % MOD;
  215.     }
  216.     for (int i = 1; i <= m; i++) {
  217.         fout << qans[i] << endl;
  218.     }
  219. }
  220.  
  221. int main() {
  222.     read();
  223.     precalc();
  224.     solve();
  225.     return 0;
  226. }
  227.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement