結果

問題 No.1000 Point Add and Array Add
ユーザー Y17
提出日時 2020-02-28 21:59:05
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
AC  
実行時間 316 ms / 2,000 ms
コード長 1,667 bytes
コンパイル時間 1,250 ms
コンパイル使用メモリ 163,556 KB
実行使用メモリ 10,496 KB
最終ジャッジ日時 2024-10-13 17:23:19
合計ジャッジ時間 5,446 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 22
権限があれば一括ダウンロードができます

ソースコード

diff #

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

#define int long long

template< typename OperatorMonoid >
struct DuelSegmentTree {
  using H = function< OperatorMonoid(OperatorMonoid, OperatorMonoid) >;

  int sz, height;
  vector< OperatorMonoid > lazy;
  const H h;
  const OperatorMonoid OM0;


  DuelSegmentTree(int n, const H h, const OperatorMonoid OM0)
      : h(h), OM0(OM0) {
    sz = 1;
    height = 0;
    while(sz < n) sz <<= 1, height++;
    lazy.assign(2 * sz, OM0);
  }

  inline void propagate(int k) {
    if(lazy[k] != OM0) {
      lazy[2 * k + 0] = h(lazy[2 * k + 0], lazy[k]);
      lazy[2 * k + 1] = h(lazy[2 * k + 1], lazy[k]);
      lazy[k] = OM0;
    }
  }

  inline void thrust(int k) {
    for(int i = height; i > 0; i--) propagate(k >> i);
  }

  void update(int a, int b, const OperatorMonoid &x) {
    thrust(a += sz);
    thrust(b += sz - 1);
    for(int l = a, r = b + 1; l < r; l >>= 1, r >>= 1) {
      if(l & 1) lazy[l] = h(lazy[l], x), ++l;
      if(r & 1) --r, lazy[r] = h(lazy[r], x);
    }
  }

  OperatorMonoid operator[](int k) {
    thrust(k += sz);
    return lazy[k];
  }
};

signed main(){
	int n, q;
	cin >> n >> q;

	int a[200010];
	for(int i = 0;i < n;i++) cin >> a[i];

	DuelSegmentTree<int> seg(n, [](int a, int b){
		return a + b; 
	}, 0);

	int b[200010] = {};
	
	for(int i = 0;i < q;i++){
		char c;
		int x, y;
		cin >> c >> x >> y;
		x--;
		if(c == 'A'){
			b[x] += a[x] * seg[x];
			seg.update(x, x+1, -seg[x]);
			a[x] += y;
		}else{
			seg.update(x, y, 1);
		}
	}

	for(int i = 0;i < n;i++){
		b[i] += a[i] * seg[i];
		cout << b[i];
		if(i < n-1){
			cout << " ";
		}else{
			cout << endl;
		}
	}

	return 0;
}
0