結果
問題 | No.1000 Point Add and Array Add |
ユーザー |
|
提出日時 | 2020-02-28 21:34:22 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 92 ms / 2,000 ms |
コード長 | 5,113 bytes |
コンパイル時間 | 1,476 ms |
コンパイル使用メモリ | 173,740 KB |
実行使用メモリ | 11,264 KB |
最終ジャッジ日時 | 2024-10-13 16:58:42 |
合計ジャッジ時間 | 4,122 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 22 |
ソースコード
#include <bits/stdc++.h> // clang-format off#define pb push_back#define eb emplace_back#define fi first#define se second#define each(x,v) for(auto& x : v)#define all(v) (v).begin(),(v).end()#define sz(v) ((int)(v).size())#define ini(...) int __VA_ARGS__; in(__VA_ARGS__)#define inl(...) long long __VA_ARGS__; in(__VA_ARGS__)#define ins(...) string __VA_ARGS__; in(__VA_ARGS__)#ifdef ONLINE_JUDGE#define rep(i,N) for(int i = 0; i < (int)(N); i++)#define repr(i,N) for(int i = (int)(N) - 1; i >= 0; i--)#define rep1(i,N) for(int i = 1; i <= (int)(N) ; i++)#define repr1(i,N) for(int i = (N) ; (int)(i) > 0 ; i--)#else#define rep(i,N) for(long long i = 0; i < (long long)(N); i++)#define repr(i,N) for(long long i = (long long)(N) - 1; i >= 0; i--)#define rep1(i,N) for(long long i = 1; i <= (long long)(N) ; i++)#define repr1(i,N) for(long long i = (N) ; (long long)(i) > 0 ; i--)#endifusing namespace std; void solve();using ll = long long; template<class T = ll> using V = vector<T>;using vi = V<int>; using vl = V<>; using vvi = V< V<int> >;constexpr int inf = 1001001001; constexpr ll infLL = (1LL << 61) - 1;struct IoSetupNya {IoSetupNya() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(15); cerr << fixed << setprecision(7);} } iosetupnya;template<typename T, typename U> inline bool amin(T &x, U y) { return (y < x) ? (x = y, true) : false; }template<typename T, typename U> inline bool amax(T &x, U y) { return (x < y) ? (x = y, true) : false; }template<typename T, typename U> ostream& operator <<(ostream& os, const pair<T, U> &p) { os << p.first << " " << p.second; return os; }template<typename T, typename U> istream& operator >>(istream& is, pair<T, U> &p) { is >> p.first >> p.second; return is; }template<typename T> ostream& operator <<(ostream& os, const vector<T> &v) { int s = (int)v.size(); for(int i=0;i<s;i++) os << (i ? " " : "") << v[i]; return os; }template<typename T> istream& operator >>(istream& is, vector<T> &v) { for(auto &x : v) is >> x; return is; }void in(){} template <typename T,class... U> void in(T &t,U &...u){ cin >> t; in(u...);}void out(){cout << "\n";} template <typename T,class... U> void out(const T &t,const U &...u){ cout << t; if(sizeof...(u)) cout << " "; out(u...);}template<typename T>void die(T x){out(x); exit(0);}#ifdef NyaanDebug#include "NyaanDebug.h"#define trc(...) do { cerr << #__VA_ARGS__ << " = "; dbg_out(__VA_ARGS__);} while(0)#define trca(v,N) do { cerr << #v << " = "; array_out(v , N);} while(0)#define trcc(v) do { cerr << "name : " << #v << "\n"; int cnt = 0; each(x , v){cerr << (cnt++) << " : "; trc(x); } } while(0)#else#define trc(...)#define trca(...)#define trcc(...)int main(){solve();}#endif#define inc(...) char __VA_ARGS__; in(__VA_ARGS__)#define in2(s,t) rep(i,sz(s)){in(s[i] , t[i]);}#define in3(s,t,u) rep(i,sz(s)){in(s[i] , t[i] , u[i]);}using vd = V<double>; using vs = V<string>; using vvl = V< V<> >;template<typename T,typename U>ll ceil(T a,U b){return (a + b - 1) / b;}using P = pair<ll,ll>; using vp = V<P>;constexpr int MOD = /**/ 1000000007; //*/ 998244353;// clang-format on///////////////////////////////////////////////////////////// BITtemplate< typename T >struct BIT {int N; int max_2beki;vector< T > data;// 初期化 1-indexedでデータを管理する 0で初期化BIT(int size){N = ++size;data.assign(N, 0);max_2beki = 1;while(max_2beki * 2 <= N) max_2beki *= 2;}// [0,k](閉区間)の総和 閉区間に注意!T sum(int k) {if(k < 0) return 0; // k<0のとき0を返すT ret = 0;for(++k; k > 0; k -= k & -k) ret += data[k];return (ret);}// [l,r](閉区間)の総和inline T sum(int l,int r){return sum(r) - sum(l-1);}// 一点取得 更新はできないことに注意inline T operator[](int k){return sum(k) - sum(k-1);}// data[k] += x;void add(int k, T x) {for(++k; k < N; k += k & -k) data[k] += x;}// imos法 [l,r]にxを加算void imos(int l,int r,T x){add(l , x); add(r + 1 , -x);}// lower_bound sum(i)がval以上となる最小のiint lower_bound(T w){if(w <= 0) return 0;int x = 0;for(int k = max_2beki; k > 0; k /= 2){if(x+k <= N - 1 && data[x + k] < w){w -= data[x + k];x += k;}}return x;}// upper_bound sum(i)がvalより大きくなる最小のiint upper_bound(T w){if(w < 0) return 0;int x = 0;for(int k = max_2beki; k > 0; k /= 2){if(x+k <= N - 1 && data[x + k] <= w){w -= data[x + k];x += k;}}return x;}};void solve(){ini(N , Q);vl a(N); in(a);vector<char> c(Q);vl x(Q),y(Q);in3(c,x,y);each(n,x)n--;rep(i,Q) if(c[i]=='B')y[i]--;vl ans(N);BIT<ll> bit(N + 10);repr(i , Q){if(c[i] == 'A'){ans[x[i]] += bit.sum(x[i]) * y[i];}else {bit.imos(x[i] , y[i] , 1);}}rep(i , N) ans[i] += a[i] * bit.sum(i);out(ans);}