Advertisement
Guest User

Untitled

a guest
Feb 28th, 2018
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #define lli long long int
  3. using namespace std;
  4.  
  5. const int MAXN = 200005;
  6. const int MAX_VAL = 105;
  7.  
  8. int pref[MAXN];
  9. int v[MAXN];
  10.  
  11. int get_sum(int l, int r) {
  12.     return pref[r] - pref[l - 1];
  13. }
  14.  
  15. lli solve(lli idx, int n) {
  16.     int low = 0;
  17.     int high = MAXN * MAX_VAL;
  18.     lli ans = 0;
  19.  
  20.     if (idx <= 0) {
  21.         return 0;
  22.     }
  23.  
  24.     while(low <= high) {
  25.         int maxi = (low + high) / 2;
  26.  
  27.         int l = 1;
  28.         int r = 0;
  29.         lli qt = 0;
  30.         lli add = 0; // what we should add for good segments ending in pos r
  31.         lli tot = 0; // total sum such that every sum is < maxi
  32.  
  33.         while(r <= n) {
  34.             if (r < l) {
  35.                 r++;
  36.                 add += 1LL * (r - l + 1) * v[r];
  37.             } else if (get_sum(l, r) < maxi) {
  38.                 qt += r - l + 1;
  39.                 tot += add;
  40.                 r++;
  41.                 add += 1LL * (r - l + 1) * v[r];
  42.             } else {
  43.                 add -= get_sum(l, r);
  44.                 l++;
  45.             }
  46.         }
  47.  
  48.         if (qt >= idx) {
  49.             high = maxi - 1;
  50.         } else {
  51.             ans = tot + (idx - qt) * maxi;
  52.             low = maxi + 1;
  53.         }
  54.     }
  55.     return ans;
  56. }
  57.  
  58. int main(void) {
  59.     int t;
  60.     int n, q;
  61.     lli l, r;
  62.  
  63.     scanf(" %d", &t);
  64.     for (int test = 1; test <= t; test++) {
  65.         scanf(" %d %d", &n, &q);
  66.         pref[0] = 0;
  67.         for (int i = 1; i <= n; i++) {
  68.             scanf(" %d", &v[i]);
  69.             pref[i] = v[i] + pref[i - 1];
  70.         }
  71.  
  72.         printf("Case #%d:\n", test);
  73.         for (int i = 0; i < q; i++) {
  74.             scanf(" %lld %lld", &l, &r);
  75.             lli ans = solve(r, n) - solve(l - 1, n);
  76.             printf("%lld\n", ans);
  77.         }
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement