結果
問題 | No.833 かっこいい電車 |
ユーザー |
![]() |
提出日時 | 2019-05-24 22:31:23 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 218 ms / 2,000 ms |
コード長 | 2,610 bytes |
コンパイル時間 | 769 ms |
コンパイル使用メモリ | 73,064 KB |
実行使用メモリ | 5,632 KB |
最終ジャッジ日時 | 2024-07-02 03:44:07 |
合計ジャッジ時間 | 5,018 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 30 |
ソースコード
#include <iostream>#include <algorithm>#include <vector>#include <climits>#include <cmath>using namespace std;typedef long long ll;const ll INF = (1LL << 31) - 1;struct RUQ {int N, K;vector<ll> data;vector<ll> lazyUpdate; // -1ならupdateしないRUQ(int N): N(N) {K = sqrt(N) + 1;data.resize(K * K + 1, INF);lazyUpdate.resize(K + 1, -1);}// kは分割した配列のindexvoid evil(int k) {if(lazyUpdate[k] != -1) {for(int i = k * K; i < (k + 1) * K; i++) {data[i] = lazyUpdate[k];}lazyUpdate[k] = -1;}}// [s, t)void update(int s, int t, int x) {for(int k = 0; k < K; k++) {int l = k * K, r = (k + 1) * K;// 区間でないif(r <= s || t <= l) continue;// 完全に含まれているif(s <= l && r <= t) {lazyUpdate[k] = x;} else {evil(k);for(int i = max(s, l); i < min(t, r); i++) {data[i] = x;}}}}int find(int i) {int k = i / K;evil(k);return data[i];}};struct BIT{private:vector<ll> bit;int N;public:BIT(){init();}BIT(int N):N(N){init();}void init(){bit.clear();bit.resize(N+1,0);}ll sum(int i){ll s = 0;while(i>0){s += bit[i];i -= i&-i;}return s;}ll sum_range(int l,int r){return sum(r)-sum(l-1);}void add(int i,ll x){while(i<=N){bit[i] += x;i += i&-i;}}ll sum0(int i){return sum(i+1);}void add0(int i,ll x){add(i+1,x);}};int N,Q;int main(){cin >> N >> Q;RUQ segL(N+1),segR(N+1);ll a;for(int i=1;i<=N;i++){segL.update(i,i+1,i);segR.update(i,i+1,i);}BIT bit(N+1);for(int i=1;i<=N;i++){cin >> a;bit.add(i,a);}int q,x;for(int i=1;i<=Q;i++){cin >> q;if(q==1){cin >> x;int newr = segR.find(x+1);int newl = segL.find(x);segR.update(newl,x+1,newr);segL.update(x+1,newr+1,newl);}else if(q==2){cin >> x;int newr = segR.find(x+1);int newl = segL.find(x);segR.update(newl,x+1,x);segL.update(x+1,newr+1,x+1);}else if(q==3){cin >> x;bit.add(x,1);}else{cin >> x;cout << bit.sum_range(segL.find(x),segR.find(x)) << endl;}}}