Advertisement
Guest User

Untitled

a guest
Mar 14th, 2022
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. using namespace __gnu_pbds;
  4. using namespace std;
  5. #define int long long
  6. #define ps(x,y) fixed<<setprecision(y)<<x
  7. #define ld long double
  8. #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL);
  9. #define endl "\n"
  10. #define setbits(x) __builtin_popcount(x)
  11. #define gcd(a,b) __gcd(a,b)
  12. #define minv(v) *min_element(v.begin(), v.end())
  13. #define maxv(v) *max_element(v.begin(), v.end())
  14. #define print(v) for(auto k : v) cout<<k<<" "; cout<<endl;
  15. const int mod = 1e9+7;
  16. const int bit = 31;
  17. #define input(a) for(int i=0; i<a.size(); i++) cin>>a[i];
  18. typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
  19. //__________________________________________________________________________________________________________________
  20.  
  21. struct node{
  22. int singlet = 0;
  23. int doublet = 0;
  24. int triplet = 0;
  25. };
  26.  
  27. int arr[100005];
  28. node seg[4*100005];
  29.  
  30.  
  31. void build(int idx, int lo, int hi)
  32. {
  33. if(lo == hi)
  34. {
  35. seg[idx].singlet = arr[lo];
  36. return;
  37. }
  38.  
  39. int mid = (lo + hi)/2;
  40. build(2*idx + 1, lo, mid);
  41. build(2*idx + 2, mid+1, hi);
  42. seg[idx].singlet = (seg[2*idx + 1].singlet + seg[2*idx+2].singlet)%mod;
  43. seg[idx].doublet = ((seg[2*idx + 1].doublet + seg[2*idx+2].doublet)%mod + (seg[2*idx+1].singlet*seg[2*idx+2].singlet)%mod)%mod;
  44. seg[idx].triplet = ((seg[2*idx+1].triplet + seg[2*idx+2].triplet)%mod + (seg[2*idx+1].doublet*seg[2*idx+2].singlet)%mod + (seg[2*idx+2].doublet*seg[2*idx+1].singlet)%mod)%mod;
  45. }
  46.  
  47. node query(int idx, int lo, int hi, int l, int r)
  48. {
  49. //complete overlap
  50. if(lo >= l && hi <= r)
  51. return seg[idx];
  52. //no overlap
  53. if(hi < l || lo > r)
  54. {
  55. node ans;
  56. return ans;
  57. }
  58. int mid = (lo + hi)/2;
  59. node left = query(2*idx+1, lo, mid, l, r);
  60. node right = query(2*idx+2, mid+1, hi, l, r);
  61. node ans;
  62. ans.singlet = (left.singlet + right.singlet)%mod;
  63. ans.doublet = ((left.doublet + right.doublet)%mod + (left.singlet*right.singlet)%mod)%mod;
  64. ans.triplet = ((left.triplet + right.triplet)%mod + (left.doublet*right.singlet)%mod + (right.doublet*left.singlet)%mod)%mod;
  65. return ans;
  66. }
  67.  
  68.  
  69. int32_t main()
  70. {
  71. fastio;
  72. int n;
  73. cin>>n;
  74. for(int i=0; i<n; i++)
  75. cin>>arr[i];
  76. build(0, 0, n-1);
  77. int q;
  78. cin>>q;
  79. while(q--)
  80. {
  81. int l,r;
  82. cin>>l>>r;
  83. node ans = query(0, 0, n-1, l, r);
  84. cout<<ans.triplet<<endl;
  85. }
  86. return 0;
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement