結果
| 問題 |
No.1000 Point Add and Array Add
|
| コンテスト | |
| ユーザー |
rniya
|
| 提出日時 | 2020-03-03 01:27:27 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 94 ms / 2,000 ms |
| コード長 | 1,500 bytes |
| コンパイル時間 | 1,661 ms |
| コンパイル使用メモリ | 171,604 KB |
| 実行使用メモリ | 10,496 KB |
| 最終ジャッジ日時 | 2024-10-13 21:27:50 |
| 合計ジャッジ時間 | 4,581 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 22 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>
struct BinaryIndexedTree{
vector<T> dat;
BinaryIndexedTree(int n):dat(n+1,0){}
void add(int i,T x){
if (i==0) return;
for (;i<=dat.size();i+=(i&-i)) dat[i]+=x;
}
T sum(int i){
T res=0;
for (;i>0;i-=(i&-i)) res+=dat[i];
return res;
}
T query(int l,int r){ //[l,r)
return sum(r-1)-sum(l-1);
}
int lower_bound(T x){
if (x<=0) return 0;
int lb=0,r=1;
while(r<dat.size()) r<<=1;
for (;r>0;r>>=1){
if (lb+r<dat.size()&&dat[lb+r]<x){
x-=dat[lb+r]; lb+=r;
}
}
return lb+1;
}
void add0(int i,T x){
add(i+1,x);
}
T sum0(int i){
return sum(i+1);
}
T query0(int l,int r){
return sum(r)-sum(l);
}
};
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
int N,Q; cin >> N >> Q;
vector<ll> A(N),B(N,0);
for (int i=0;i<N;++i) cin >> A[i];
vector<char> c(Q);
vector<ll> x(Q),y(Q);
for (int i=0;i<Q;++i) cin >> c[i] >> x[i] >> y[i];
BinaryIndexedTree<int> BIT(N+1);
for (int i=Q-1;i>=0;--i){
if (c[i]=='A'){
B[x[i]-1]+=y[i]*BIT.sum(x[i]);
} else {
BIT.add(x[i],1);
BIT.add(y[i]+1,-1);
}
}
for (int i=0;i<N;++i){
B[i]+=A[i]*BIT.sum(i+1);
cout << B[i] << (i!=N-1?' ':'\n');
}
}
rniya