Submission #1209080

#TimeUsernameProblemLanguageResultExecution timeMemory
1209080TraianDanciuAddk (eJOI21_addk)C++20
100 / 100
256 ms6516 KiB
#include <iostream>

using namespace std;

const int MAXN = 100000;
const int MAXK = 10;

int v[MAXN + 1], poz[MAXK + 1], new_values[MAXK + 1];

struct SegmentTree {
  struct Node {
    long long sum, lazy;
  } tree[4 * (MAXN + 1)];
  int n;

  void init(int n) {
    this->n = n;
  }

  void propagate(int node, int left, int right) {
    int middle = (left + right) / 2;
    tree[2 * node].sum += tree[node].lazy * (middle - left + 1);
    tree[2 * node].lazy += tree[node].lazy;
    tree[2 * node + 1].sum += tree[node].lazy * (right - middle);
    tree[2 * node + 1].lazy += tree[node].lazy;
    tree[node].lazy = 0;
  }

  void update(int node, int left, int right, int qleft, int qright, int qval) {
    if(qleft <= left && right <= qright) {
      tree[node].sum += 1LL * qval * (right - left + 1);
      tree[node].lazy += qval;
    } else {
      propagate(node, left, right);
      int middle = (left + right) / 2;
      if(qleft <= middle) {
        update(2 * node, left, middle, qleft, qright, qval);
      }
      if(middle < qright) {
        update(2 * node + 1, middle + 1, right, qleft, qright, qval);
      }
      tree[node].sum = tree[2 * node].sum + tree[2 * node + 1].sum;
    }
  }

  void update(int left, int right, int val) {
    update(1, 0, n, left, right, val);
  }

  long long query(int node, int left, int right, int qleft, int qright) {
    if(qleft <= left && right <= qright) {
      return tree[node].sum;
    }

    propagate(node, left, right);
    int middle = (left + right) / 2;
    long long answer = 0;

    if(qleft <= middle) {
      answer += query(2 * node, left, middle, qleft, qright);
    }
    if(middle < qright) {
      answer += query(2 * node + 1, middle + 1, right, qleft, qright);
    }

    return answer;
  }

  long long query(int left, int right) {
    return query(1, 0, n, left, right);
  }
} aint;

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  int n, k;
  cin >> n >> k;
  aint.init(n + 1);
  for(int i = 1; i <= n; i++) {
    cin >> v[i];
    aint.update(i, n, v[i]);
  }

  int q;
  cin >> q;
  while(q--) {
    int type;
    cin >> type;
    if(type == 1) {
      for(int i = 1; i <= k; i++) {
        cin >> poz[i];
      }
      for(int i = 1; i < k; i++) {
        aint.update(poz[i], n, v[poz[i + 1]] - v[poz[i]]);
        new_values[i] = v[poz[i + 1]];
      }
      aint.update(poz[k], n, v[poz[1]] - v[poz[k]]);
      new_values[k] = v[poz[1]];
      for(int i = 1; i <= k; i++) {
        v[poz[i]] = new_values[i];
      }
    } else {
      int st, dr, len;
      cin >> st >> dr >> len;
      cout << aint.query(st + len - 1, dr) - aint.query(st - 1, dr - len) << "\n";
    }
  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...