Advertisement
rajeshinternshala

Untitled

May 5th, 2024
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.88 KB | None | 0 0
  1. const int N = 100001;
  2. class SegmentTree
  3. {
  4.     vector<int> data;
  5.     int n;
  6.  
  7.     int build(int idx, int start, int end)
  8.     {
  9.         if (end < start)
  10.         {
  11.             return 0;
  12.         }
  13.         if (start == end)
  14.         {
  15.             data[idx] = 1;
  16.         }
  17.         else
  18.         {
  19.             int mid = (start + end) / 2;
  20.             data[idx] = build(idx * 2, start, mid) + build(idx * 2 + 1, mid + 1, end);
  21.         }
  22.         return data[idx];
  23.     }
  24.  
  25.     void updateRange(int idx, int start, int end, int left, int right, int val)
  26.     {
  27.         if (end < start || right < start || end < left)
  28.         {
  29.             return;
  30.         }
  31.         if (start <= left && right <= end)
  32.         {
  33.             data[idx] += val;
  34.         }
  35.         if (start == end)
  36.         {
  37.             return;
  38.         }
  39.         int mid = (start + end) / 2;
  40.         updateRange(idx * 2, start, mid, left, right, val);
  41.         updateRange(idx * 2 + 1, mid + 1, end, left, right, val);
  42.     }
  43.  
  44.     int queryRange(int idx, int start, int end, int left, int right)
  45.     {
  46.         if (end < start || right < start || end < left)
  47.         {
  48.             return 0;
  49.         }
  50.         if (left <= start && end <= right)
  51.         {
  52.             return data[idx];
  53.         }
  54.         int mid = (start + end) / 2;
  55.         return queryRange(idx * 2, start, mid, left, right) +
  56.                queryRange(idx * 2 + 1, mid + 1, end, left, right);
  57.     }
  58.  
  59. public:
  60.     SegmentTree(int n)
  61.     {
  62.         this->n = n;
  63.         data = vector<int>(4 * N, 0);
  64.         build(1, 1, n);
  65.     }
  66.     void decrement(int index)
  67.     {
  68.         updateRange(1, 1, n, index + 1, index + 1, -1);
  69.     }
  70.     int query(int left, int right)
  71.     {
  72.         if (right < left)
  73.         {
  74.             return 0;
  75.         }
  76.         return queryRange(1, 1, n, left + 1, right + 1);
  77.     }
  78. };
  79.  
  80. int solve(vector<int> v)
  81. {
  82.     map<int, vector<int>> indexes;
  83.     int n = v.size();
  84.     for (int i = 0; i < n; i++)
  85.     {
  86.         indexes[v[i]].push_back(i);
  87.     }
  88.  
  89.     SegmentTree processed(n);
  90.  
  91.     int sumOfSmallerTasks = 0;
  92.     long long int result = 0;
  93.     long long int mod = 1e9 + 7;
  94.     for (auto keyValue : indexes)
  95.     {
  96.         int task = keyValue.first;
  97.         auto taskIndexes = keyValue.second;
  98.  
  99.         for (int index : taskIndexes)
  100.         {
  101.             result = (result + task) % mod;
  102.             result = (result + sumOfSmallerTasks) % mod;
  103.             int largerOrEqualOnLeft = processed.query(0, index - 1);
  104.             result = (result + (largerOrEqualOnLeft * task)) % mod;
  105.             int largerOrEqualOnRight = processed.query(index + 1, n - 1);
  106.             result = (result + (largerOrEqualOnRight * (task - 1))) % mod;
  107.         }
  108.         for (int i : taskIndexes)
  109.         {
  110.             processed.decrement(i);
  111.         }
  112.  
  113.         sumOfSmallerTasks += task * taskIndexes.size();
  114.     }
  115.     return result;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement