結果
| 問題 |
No.1000 Point Add and Array Add
|
| コンテスト | |
| ユーザー |
ngtkana
|
| 提出日時 | 2020-02-28 22:12:53 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 278 ms / 2,000 ms |
| コード長 | 1,301 bytes |
| コンパイル時間 | 1,602 ms |
| コンパイル使用メモリ | 170,816 KB |
| 実行使用メモリ | 10,612 KB |
| 最終ジャッジ日時 | 2024-10-13 17:47:32 |
| 合計ジャッジ時間 | 5,648 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 22 |
ソースコード
#include<bits/stdc++.h>
int main(){
int n,q;std::cin>>n>>q;
std::vector<long long>a(n);
for(int i=0;i<n;i++)std::cin>>a.at(i);
std::vector<long long>b(n);
int N=1;while(N<n+1)N*=2;
std::vector<long long>seg(2*N);
for(int i=0;i<q;i++){
char c;std::cin>>c;
if(c=='A'){
int i;std::cin>>i;
i--;
long long y=0;
for(int l=N,r=i+1+N;l<r;l/=2,r/=2){
if(l%2==1)y+=seg.at(l++);
if(r%2==1)y+=seg.at(--r);
}
b.at(i)+=a.at(i)*y;
seg.at(i+N)-=y;
seg.at(i+1+N)+=y;
for(int j=(i+N)/2;j>0;j/=2)seg.at(j)=seg.at(2*j)+seg.at(2*j+1);
for(int j=(i+1+N)/2;j>0;j/=2)seg.at(j)=seg.at(2*j)+seg.at(2*j+1);
int x;std::cin>>x;
a.at(i)+=x;
}
if(c=='B'){
int l,r;std::cin>>l>>r;
l--;
seg.at(l+N)++;
seg.at(r+N)--;
for(int j=(l+N)/2;j>0;j/=2)seg.at(j)=seg.at(2*j)+seg.at(2*j+1);
for(int j=(r+N)/2;j>0;j/=2)seg.at(j)=seg.at(2*j)+seg.at(2*j+1);
}
}
long long coeff=0;
for(int i=0;i<n;i++){
coeff+=seg.at(i+N);
std::cout<<(i?" ":"")<<a.at(i)*coeff+b.at(i);
}
std::cout<<std::endl;
}
ngtkana