Advertisement
a53

sufle

a53
Aug 11th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<cassert>
  4. using namespace std;
  5.  
  6. #define BITMAX 20
  7. #define NMAX 100005
  8. #define value first
  9. #define number second
  10.  
  11. int n,m,v[NMAX];
  12. int partialBits[BITMAX][NMAX];
  13. vector< pair<int,int> > bucket;
  14.  
  15. int main () {
  16. int a, b;
  17.  
  18. freopen("sufle.in","r",stdin);
  19. freopen("sufle.out","w",stdout);
  20.  
  21. assert(scanf("%d%d",&n,&m) == 2);
  22. assert(1 <= n && n <= 100000);
  23. assert(1 <= m && m <= 100000);
  24. for(int i = 1; i <= n; i++) {
  25. assert(scanf("%d",&v[i]) == 1);
  26. assert(0 <= v[i] && v[i] <= 1000000);
  27. }
  28.  
  29. for(int bit = 0; bit < BITMAX; bit++) {
  30. for(int i = 1; i <= n; i++)
  31. partialBits[bit][i] = partialBits[bit][i - 1] + ((v[i] & (1 << bit)) ? 1 : 0);
  32. }
  33. for(int i = 1; i <= m; i++) {
  34. assert(scanf("%d%d",&a,&b) == 2);
  35. assert(1 <= a && a <= b && b <= n);
  36. bucket.push_back(make_pair(0, b - a + 1));
  37. for(int bit = BITMAX - 1; bit >= 0; bit--) {
  38. int cntBit = partialBits[bit][b] - partialBits[bit][a - 1];
  39. //printf("Bitul %d apare de %d ori\n", bit, cntBit);
  40. int numBuckets = bucket.size();
  41. for(int j = 0; j < numBuckets && cntBit; j++) {
  42. if(bucket[j].number <= cntBit) {
  43. cntBit -= bucket[j].number;
  44. bucket[j].value += (1 << bit);
  45. }
  46. else {
  47. bucket.push_back(bucket[numBuckets - 1]);
  48. for(int k = numBuckets - 1; k > j + 1; k--) {
  49. bucket[k] = bucket[k - 1];
  50. }
  51. bucket[j + 1] = make_pair(bucket[j].value + (1 << bit), cntBit);
  52. bucket[j].number -= cntBit;
  53. cntBit = 0;
  54. }
  55. }
  56. }
  57.  
  58. int numBucket = bucket.size();
  59. long long answer = 0;
  60. for(int j = 0; j < numBucket; j++) {
  61. answer += (long long)bucket[j].value * bucket[j].value * bucket[j].number;
  62. // printf("%d %d\n", bucket[j].value, bucket[j].number);
  63. }
  64. printf("%lld\n", answer);
  65.  
  66. bucket.clear();
  67. }
  68.  
  69. return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement