Advertisement
Guest User

Untitled

a guest
May 7th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10.  
  11. void recalc(int n, const vector<int>& a, int& start_size, vector<vector<int>>& blocks) {
  12.     start_size = sqrt(n);
  13.     blocks.clear();
  14.     for (int i = 0; i < n; ++i) {
  15.         if (i / start_size == blocks.size()) {
  16.             blocks.push_back(vector<int>{});
  17.         }
  18.         blocks[i / start_size].push_back(a[i]);
  19.     }
  20. }
  21.  
  22. ll sqr(int x) {
  23.     ll y = x;
  24.     return y * y;
  25. }
  26.  
  27. int main() {
  28.     int n, p;
  29.     cin >> n >> p;
  30.     vector<int> a(n);
  31.     ll summ = 0;
  32.     for (int i = 0; i < n; ++i) {
  33.         cin >> a[i];
  34.         summ += sqr(a[i]);
  35.     }
  36.     cout << summ << endl;
  37.     int k;
  38.     cin >> k;
  39.     int start_size;
  40.     vector<vector<int>> blocks;
  41.     recalc(n, a, start_size, blocks);
  42.     for (int i = 0; i < k; ++i) {
  43.         int type, pos;
  44.         cin >> type >> pos;
  45.         pos--;
  46.         int block = 0;
  47.         while (pos >= blocks[block].size()) {
  48.             pos -= blocks[block].size();
  49.             block++;
  50.         } //block, pos
  51.         int lft = blocks[block][pos] / 2, rght = (blocks[block][pos] + 1) / 2;
  52.         summ -= sqr(blocks[block][pos]);
  53.         if (type == 1) {
  54.             blocks[block].erase(blocks[block].begin() + pos);//pos - 1, pos
  55.             int leftblock, leftpos, rightblock, rightpos;
  56.             if (pos == 0) {
  57.                 leftblock = block - 1;
  58.                 leftpos = (leftblock == -1 ? -1 : blocks[leftblock].size() - 1);
  59.             } else {
  60.                 leftblock = block;
  61.                 leftpos = pos - 1;
  62.             }
  63.             if (blocks[block].size() == pos) {
  64.                 rightblock = block + 1;
  65.                 rightpos = 0;
  66.             } else {
  67.                 rightblock = block;
  68.                 rightpos = pos;
  69.             }
  70.             if (leftblock == -1) {
  71.                 summ -= sqr(blocks[rightblock][rightpos]);
  72.                 blocks[rightblock][rightpos] += (lft + rght);
  73.                 summ += sqr(blocks[rightblock][rightpos]);
  74.             } else if (rightblock == blocks.size()) {
  75.                 summ -= sqr(blocks[leftblock][leftpos]);
  76.                 blocks[leftblock][leftpos] += (lft + rght);
  77.                 summ += sqr(blocks[leftblock][leftpos]);
  78.             } else {
  79.                 summ -= sqr(blocks[leftblock][leftpos]);
  80.                 blocks[leftblock][leftpos] += lft;
  81.                 summ += sqr(blocks[leftblock][leftpos]);
  82.                 summ -= sqr(blocks[rightblock][rightpos]);
  83.                 blocks[rightblock][rightpos] += rght;
  84.                 summ += sqr(blocks[rightblock][rightpos]);
  85.             }
  86.         } else {
  87.             blocks[block].erase(blocks[block].begin() + pos);
  88.             summ += sqr(lft);
  89.             summ += sqr(rght);
  90.             blocks[block].insert(blocks[block].begin() + pos, lft);
  91.             blocks[block].insert(blocks[block].begin() + pos + 1, rght);
  92.             if (blocks[block].size() >= 2 * start_size) {
  93.                 a.clear();
  94.                 for (auto arr : blocks) {
  95.                     for (auto el : arr) {
  96.                         a.push_back(el);
  97.                     }
  98.                 }
  99.                 n = a.size();
  100.                 recalc(n, a, start_size, blocks);
  101.             }
  102.         }
  103.         cout << summ << endl;
  104.     }
  105.     system("pause");
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement