이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
struct Fenwick {
  int n;
  vector<long long> tree;
  Fenwick(int _n) : n(_n) {
    tree.resize(n + 1);
  }
  long long get(int x) {
    assert(0 <= x && x < n);
    long long res = 0;
    for (x++; x > 0; x -= x & -x) {
      res += tree[x];
    }
    return res;
  }
  void modify(int x, long long v) {
    assert(0 <= x && x < n);
    for (x++; x <= n; x += x & -x) {
      tree[x] += v;
    }
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
#ifdef _DEBUG
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
  freopen("debug_output.txt", "w", stderr);
#endif
  int n, m;
  cin >> n >> m;
  vector<vector<int>> owned_by(n);
  for (int i = 0; i < m; i++) {
    int s;
    cin >> s;
    --s;
    assert(0 <= s && s < n);
    owned_by[s].push_back(i);
  }
  vector<long long> target(n);
  for (int i = 0; i < n; i++) {
    cin >> target[i];
    assert(1 <= target[i] && target[i] <= (int) 1e9);
  }
  int k;
  cin >> k;
  vector<int> ll(k), rr(k);
  vector<long long> add(k);
  for (int i = 0; i < k; i++) {
    cin >> ll[i] >> rr[i] >> add[i];
    --ll[i];
    --rr[i];
    assert(0 <= ll[i] && ll[i] < m);
    assert(0 <= rr[i] && rr[i] < m);
    assert(1 <= add[i] && add[i] <= (int) 1e9);
  }
  vector<int> low(n, 0), high(n, k);
  while (true) {
    bool done = true;
    vector<int> mid(n);
    vector<vector<int>> check_at(k + 1);
    for (int i = 0; i < n; i++) {
      if (low[i] < high[i]) {
        done = false;
      }
      mid[i] = (low[i] + high[i]) >> 1;
      check_at[mid[i]].push_back(i);
    }
    if (done) {
      break;
    }
    Fenwick ft(m + 1);
    for (int qq = 0; qq < k; qq++) {
      if (ll[qq] <= rr[qq]) {
        ft.modify(ll[qq], add[qq]);
        ft.modify(rr[qq] + 1, -add[qq]);
      } else {
        ft.modify(ll[qq], add[qq]);
        // ft.modify(m, -add[qq]);
        ft.modify(0, add[qq]);
        ft.modify(rr[qq] + 1, -add[qq]);
      }
      for (int i : check_at[qq]) {
        long long sum = 0;
        for (int j : owned_by[i]) {
          sum += ft.get(j);
        }
        if (sum >= target[i]) {
          high[i] = mid[i];
        } else {
          low[i] = mid[i] + 1;
        }
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (low[i] == k) {
      cout << "NIE\n";
    } else {
      cout << low[i] + 1 << '\n';
    }
  }
  return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |