Submission #82260
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include<bits/stdc++.h> #define ll long long #define endl "\n" #define T pair<ll,ll> #define it 2000000 #define over 2097151 using namespace std; struct SegmentTree { vector<ll> data; ll size; // 配列の初期値を決めておく ll syoki=0; ll f(ll a,ll b){ // 最大値: max 最小値: min 総和 a+b return (a + b); } SegmentTree(ll n) { size = 1; while (size < n) { size <<= 1; } data.assign(2 * size, syoki); } ll query(ll a, ll b, ll k, ll l, ll r) { if (r <= a || b <= l) { return (syoki); } if (a <= l && r <= b) { return (data[k]); } return (f(query(a, b, 2 * k + 1, l, (l + r) >> 1), query(a, b, 2 * k + 2, (l + r) >> 1, r))); } ll query(ll a, ll b) { return (query(a, b, 0, 0, size)); } void update(ll k, ll x) { k += size - 1; data[k] = x; while (k > 0) { k = (k - 1) >> 1; data[k] = f(data[2 * k + 1], data[2 * k + 2]); } } void add(ll k,ll x) { k += size - 1; data[k] += x; while (k > 0) { k = (k - 1) >> 1; data[k] = f(data[2 * k + 1], data[2 * k + 2]); } } }; int main(){ ll n; cin >> n; vector<ll>a(n); set<ll> s; for (ll i=0;i<n;i++){ cin >> a[i]; s.insert(a[i]); } ll q; cin >> q; vector<pair<ll,pair<ll,ll>>> p(q); for (ll i=0;i<q;i++){ cin >> p[i].first >> p[i].second.first; if (p[i].first == 1){ p[i].second.first--; cin >> p[i].second.second; s.insert(p[i].second.second); } else { s.insert(p[i].second.first); } } vector<ll>b(s.size()); ll i = 0; for (auto &j:s){ b[i] = j; i++; } SegmentTree g(s.size()); for (ll i=0;i<a.size();i++){ g.add(lower_bound(b.begin(),b.end(),a[i])-b.begin(),1); // cout << lower_bound(b.begin(),b.end(),a[i])-b.begin() << endl; } for (ll i=0;i<q;i++){ if (p[i].first == 1){ g.add(lower_bound(b.begin(),b.end(),a[p[i].second.first])-b.begin(),-1); g.add(lower_bound(b.begin(),b.end(),p[i].second.second)-b.begin(),1); a[p[i].second.first] = p[i].second.second; } else { cout << g.query(0,lower_bound(b.begin(),b.end(),p[i].second.first)-b.begin()+1) << endl; } } } //1 3 5 9 |
ステータス
項目 | データ |
---|---|
問題 | 1907 - Count2 |
ユーザー名 | DAI_0110 |
投稿日時 | 2025-01-07 15:09:43 |
言語 | C++17 |
状態 | Accepted |
得点 | 14 |
ソースコード長 | 2609 Byte |
最大実行時間 | 923 ms |
最大メモリ使用量 | 63300 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 14 / 14 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
input1.txt | AC | 22 ms | 604 KB |
1
|
input2.txt | AC | 21 ms | 936 KB |
1
|
input3.txt | AC | 30 ms | 904 KB |
1
|
input4.txt | AC | 17 ms | 996 KB |
1
|
input5.txt | AC | 19 ms | 1088 KB |
1
|
input6.txt | AC | 19 ms | 1064 KB |
1
|
input7.txt | AC | 19 ms | 1560 KB |
1
|
input8.txt | AC | 113 ms | 9324 KB |
1
|
input9.txt | AC | 647 ms | 45464 KB |
1
|
input10.txt | AC | 923 ms | 63300 KB |
1
|