Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. //
  2. // Created by deadcode on 17.1.18.
  3. //
  4.  
  5. #ifndef UNTITLED_REQUESTPARSER_H
  6. #define UNTITLED_REQUESTPARSER_H
  7.  
  8. #include <bits/stdc++.h>
  9.  
  10. using namespace std;
  11. using ll = long long;
  12.  
  13. class RequestParser
  14. {
  15. public:
  16.     vector<vector<pair<pair<int, int>, int> > > blocks;
  17.     ll _len, _sz, _m;
  18.     void parse(int m)
  19.     {
  20.         int l, r;
  21.         int len, sz;
  22.         if(m == int(sqrt(m))*int(sqrt(m)))
  23.         {
  24.             len = sqrt(m);
  25.             sz = len;
  26.         }
  27.         else
  28.         {
  29.             len= sqrt(m) + 1;
  30.             sz = m/len + 1;
  31.         }
  32.         _len = len, _sz = sz, _m = m;
  33.         blocks.resize(sz);
  34.         for(int i = 0; i < m; i++)
  35.         {
  36.             cin>>l>>r;
  37.             blocks[l/len].push_back({{l, r}, i});
  38.         }
  39.         for(int i = 0; i<blocks.size(); i++)
  40.             sort(blocks[i].begin(), blocks[i].end());
  41.  
  42.         cout<<blocks.size()<<endl;
  43.     }
  44.  
  45.     vector<ll> solve(const vector<ll> & vec)
  46.     {
  47.         vector<ll> res(_m);
  48.         for(int i = 0; i<_sz; i++)
  49.         {
  50.             auto ans = find_ans(i, vec);
  51.             for(auto it : ans)
  52.                 res[it.first] = it.second;
  53.         }
  54.         return res;
  55.     }
  56.  
  57.     vector<pair<int, ll> > find_ans(ll s, const vector<ll> & vec)
  58.     {
  59.         map<int, int> cnt;
  60.         int l = blocks[s][0].first.first,
  61.             r = blocks[s][0].first.second;
  62.         for(int i = l; i<=r; i++)
  63.         {
  64.             cnt[vec[i]]++;
  65.         }
  66.         ll sum = 0;
  67.         for(auto it : cnt)
  68.         {
  69.             sum += it.first*it.second*it.second;
  70.         }
  71.  
  72.         vector<pair<int, ll> > ret;
  73.  
  74.         ret.push_back({blocks[s][0].second, sum});
  75.  
  76.         for(int i = 1; i < blocks[s].size(); i++)
  77.             ret.push_back({blocks[s][i].second, 0});
  78.  
  79.         for(int i = 1; i < blocks[s].size(); i++)
  80.         {
  81.             int next_l = blocks[s][0].first.first,
  82.                     next_r = blocks[s][0].first.second;
  83.             while(l < next_l)
  84.                 sum = move_border(l++, sum, 1, -1, cnt, vec);
  85.             while(l > next_l)
  86.                 sum = move_border(l++, sum, -1, 1, cnt, vec);
  87.             while(r < next_r)
  88.                 sum = move_border(r++, sum, 1, 1, cnt, vec);
  89.             while(r > next_r)
  90.                 sum = move_border(r++, sum, -1, -1, cnt, vec);
  91.             ret.push_back({blocks[s][i].second, sum});
  92.         }
  93.         return ret;
  94.     }
  95.     ll move_border(ll pos, ll cur_sum, int add_ind, int add_val, map<int, int> & cnt, const vector<ll> & vec)
  96.     {
  97.         int val = vec[pos+add_ind];
  98.         cur_sum -= cnt[val]*cnt[val]*val;
  99.         cnt[val] += add_val;
  100.         cur_sum += cnt[val]*cnt[val]*val;
  101.         return cur_sum;
  102.     }
  103. };
  104.  
  105. #endif //UNTITLED_REQUESTPARSER_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement