Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Created by deadcode on 17.1.18.
- //
- #ifndef UNTITLED_REQUESTPARSER_H
- #define UNTITLED_REQUESTPARSER_H
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- class RequestParser
- {
- public:
- vector<vector<pair<pair<int, int>, int> > > blocks;
- ll _len, _sz, _m;
- void parse(int m)
- {
- int l, r;
- int len, sz;
- if(m == int(sqrt(m))*int(sqrt(m)))
- {
- len = sqrt(m);
- sz = len;
- }
- else
- {
- len= sqrt(m) + 1;
- sz = m/len + 1;
- }
- _len = len, _sz = sz, _m = m;
- blocks.resize(sz);
- for(int i = 0; i < m; i++)
- {
- cin>>l>>r;
- blocks[l/len].push_back({{l, r}, i});
- }
- for(int i = 0; i<blocks.size(); i++)
- sort(blocks[i].begin(), blocks[i].end());
- cout<<blocks.size()<<endl;
- }
- vector<ll> solve(const vector<ll> & vec)
- {
- vector<ll> res(_m);
- for(int i = 0; i<_sz; i++)
- {
- auto ans = find_ans(i, vec);
- for(auto it : ans)
- res[it.first] = it.second;
- }
- return res;
- }
- vector<pair<int, ll> > find_ans(ll s, const vector<ll> & vec)
- {
- map<int, int> cnt;
- int l = blocks[s][0].first.first,
- r = blocks[s][0].first.second;
- for(int i = l; i<=r; i++)
- {
- cnt[vec[i]]++;
- }
- ll sum = 0;
- for(auto it : cnt)
- {
- sum += it.first*it.second*it.second;
- }
- vector<pair<int, ll> > ret;
- ret.push_back({blocks[s][0].second, sum});
- for(int i = 1; i < blocks[s].size(); i++)
- ret.push_back({blocks[s][i].second, 0});
- for(int i = 1; i < blocks[s].size(); i++)
- {
- int next_l = blocks[s][0].first.first,
- next_r = blocks[s][0].first.second;
- while(l < next_l)
- sum = move_border(l++, sum, 1, -1, cnt, vec);
- while(l > next_l)
- sum = move_border(l++, sum, -1, 1, cnt, vec);
- while(r < next_r)
- sum = move_border(r++, sum, 1, 1, cnt, vec);
- while(r > next_r)
- sum = move_border(r++, sum, -1, -1, cnt, vec);
- ret.push_back({blocks[s][i].second, sum});
- }
- return ret;
- }
- ll move_border(ll pos, ll cur_sum, int add_ind, int add_val, map<int, int> & cnt, const vector<ll> & vec)
- {
- int val = vec[pos+add_ind];
- cur_sum -= cnt[val]*cnt[val]*val;
- cnt[val] += add_val;
- cur_sum += cnt[val]*cnt[val]*val;
- return cur_sum;
- }
- };
- #endif //UNTITLED_REQUESTPARSER_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement