Guest User

Untitled

a guest
Feb 25th, 2021
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. #include <iomanip>
  2. #include <iostream>
  3. #include <vector>
  4. #include <set>
  5. #include <algorithm>
  6. #include <map>
  7. #include <queue>
  8. #include <string>
  9.  
  10. #define ll long long
  11. #define ull unsigned long long
  12. #define mp make_pair
  13. #define pb push_back
  14. #define free variable1
  15. #define y0 var1
  16. #define rank var2
  17.  
  18. using namespace std;
  19.  
  20. const int N = 300010;
  21. const int MOD = 1e9+7;
  22. const int B = 30;
  23.  
  24. int n, a[N];
  25. int lpos[N], rpos[N];
  26. int s[40][N], cnt[40][N];
  27.  
  28. void add(int &a, int b) {
  29. a += b;
  30. if (a >= MOD) a -= MOD;
  31. }
  32.  
  33. int product(int a, int b) {
  34. return (1ll * a * b) % MOD;
  35. }
  36.  
  37. int getcnt(int b, int l, int r, int val) {
  38. int res = cnt[b][r];
  39. if (l != 0) res -= cnt[b][l - 1];
  40. if (val == 0) res = r - l + 1 - res;
  41. return res;
  42. }
  43.  
  44. int stup() {
  45. int ans = 0;
  46. for (int i = 1; i <= n; i++) {
  47. int mx = -1, xr = 0;
  48. for (int j = i; j <= n; j++) {
  49. mx = max(mx, a[j]);
  50. xr ^= a[j];
  51. int tmp= (1ll * mx * xr) % MOD;
  52. ans = (ans + tmp) % MOD;
  53. }
  54. }
  55. return ans;
  56. }
  57.  
  58. int main() {
  59. cin >> n;
  60. for (int i = 1; i <= n; i++) cin >> a[i];
  61. a[0] = 2e9;
  62. a[n + 1] = 2e9;
  63. for (int i = 1; i <= n; i++) {
  64. lpos[i] = i - 1;
  65. while (a[lpos[i]] < a[i]) lpos[i] = lpos[lpos[i]];
  66. }
  67. for (int i = n; i >= 1; i--) {
  68. rpos[i] = i + 1;
  69. while (a[rpos[i]] <= a[i]) rpos[i] = rpos[rpos[i]];
  70. }
  71. for (int b = 0; b < B; b++) {
  72. s[b][0] = 0;
  73. for (int i = 1; i <= n; i++) {
  74. s[b][i] = s[b][i - 1];
  75. if (a[i] & (1 << b)) s[b][i] ^= 1;
  76. }
  77. cnt[b][0] = 0;
  78. for (int i = 1; i <= n; i++) {
  79. cnt[b][i] = cnt[b][i - 1] + s[b][i];
  80. }
  81. }
  82. int ans = 0;
  83. for (int i = 1; i <= n; i++) {
  84. int l = lpos[i] + 1, r = rpos[i] - 1;
  85. for (int b = 0; b < B; b++) {
  86. int segs = 0;
  87. add(segs, product(getcnt(b, i, r, 1), getcnt(b, l - 1, i - 1, 0)));
  88. add(segs, product(getcnt(b, i, r, 0), getcnt(b, l - 1, i - 1, 1)));
  89. int tmp = product(segs, (1 << b));
  90. add(ans, product(tmp, a[i]));
  91. }
  92. }
  93. //cout << stup() << endl;
  94. cout << ans;
  95. return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment