Cod sursa(job #3252309)

Utilizator rockoanaOana Pasca rockoana Data 29 octombrie 2024 10:21:25
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
/*
                    __
                   /\ \
 _ __   ___     ___\ \ \/'\     ___      __      ___     ___      __
/\`'__\/ __`\  /'___\ \ , <    / __`\  /'__`\  /' _ `\ /' _ `\  /'__`\
\ \ \//\ \L\ \/\ \__/\ \ \\`\ /\ \L\ \/\ \L\.\_/\ \/\ \/\ \/\ \/\ \L\.\_
 \ \_\\ \____/\ \____\\ \_\ \_\ \____/\ \__/.\_\ \_\ \_\ \_\ \_\ \__/.\_\
  \/_/ \/___/  \/____/ \/_/\/_/\/___/  \/__/\/_/\/_/\/_/\/_/\/_/\/__/\/_/


*/

#include <bits/stdc++.h>
using namespace std;
using i64 = int64_t;

vector<int> sq, v;
int r, n, m;

void update(int val, int pos) {
  pos--;
  v[pos] -= val;
  sq[pos / r] -= val;
}

int query(int s, int d) {
  s--, d--;
  int res = 0;
  if (d / r == s / r) {  // all in one
    for (int i = s; i <= d; i++) {
      res += v[i];
    }
    return res;
  }

  int f1 = s / r;
  if (s != f1) {
    f1++;
    for (int i = s; i < r * f1; i++) {
      res += v[i];
    }
  }

  int f2 = d / r;
  if (d != (f2 + 1) * r - 1) {
    for (int i = f2 * r; i <= d; i++) {
      res += v[i];
    }
    f2--;
  }

  for (int i = f1; i <= f2; i++) {
    res += sq[i];
  }
  return res;
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  // #ifdef LOCAL
  //   ifstream cin{"input.txt"};
  //   ofstream cout{"output.txt"};
  // #endif

  ifstream cin{"datorii.in"};
  ofstream cout{"datorii.out"};

  cin >> n >> m;

  v.assign(n, 0);
  for (int i = 0; i < n; i++) {
    cin >> v[i];
  }

  r = ceil(sqrt(n));
  sq.assign(r, 0);
  int last = 1;
  for (int i = 0; i < n; i++) {
    if (i >= r * last) {
      last++;
    }
    sq[last - 1] += v[i];
  }

  int c = 0;
  int val, pos, s, d;
  for (int q = 0; q < m; q++) {
    cin >> c;
    if (c == 0) {  // update
      cin >> pos >> val;
      update(val, pos);
    } else {  // query
      cin >> s >> d;
      cout << query(s, d) << endl;
    }
  }

  return 0;
}