結果
問題 | No.618 labo-index |
ユーザー |
|
提出日時 | 2018-01-02 00:45:03 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 250 ms / 6,000 ms |
コード長 | 2,401 bytes |
コンパイル時間 | 2,167 ms |
コンパイル使用メモリ | 176,484 KB |
実行使用メモリ | 6,508 KB |
最終ジャッジ日時 | 2024-12-23 00:03:11 |
合計ジャッジ時間 | 7,622 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
ソースコード
#include "bits/stdc++.h"using namespace std;#define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i))#define rep(i,j) FOR(i,0,j)#define each(x,y) for(auto &(x):(y))#define mp make_pair#define mt make_tuple#define all(x) (x).begin(),(x).end()#define debug(x) cout<<#x<<": "<<(x)<<endl#define smax(x,y) (x)=max((x),(y))#define smin(x,y) (x)=min((x),(y))#define MEM(x,y) memset((x),(y),sizeof (x))#define sz(x) (int)(x).size()#define pb push_backtypedef long long ll;typedef pair<int, int> pii;typedef vector<int> vi;typedef vector<ll> vll;template<class Val>struct BinaryIndexedTree {int n;vector<Val> t;BinaryIndexedTree() {}BinaryIndexedTree(int _n) :n(_n + 1), t(_n + 1) {}void add(int k, Val val) {k++;while (k < n) {t[k] += val;k += (k&-k);}}void set(int k, Val val) {add(k, -sum(k, k + 1));add(k, val);}Val sum(int k) {Val r = 0;while (k > 0) {r += t[k];k -= (k&-k);}return r;}Val sum(int l, int r) {return sum(r) - sum(l);}};typedef BinaryIndexedTree<int> BIT;ll A = 0, B = 0;int Q, T[100005], X[100005], idx[100005];vll men, pw;int main(){ios::sync_with_stdio(false);cin.tie(0);cin >> Q;rep(i, Q) {cin >> T[i] >> X[i];if (T[i] == 1) {men.push_back(X[i] - A);idx[i] = sz(men) - 1;}if (T[i] == 3)A += X[i];}pw = men;sort(all(pw));pw.erase(unique(all(pw)), pw.end());int P = sz(pw);BIT bit(P);rep(i, Q) {int t = T[i], x = X[i];if (t == 1) {int k = lower_bound(all(pw), men[idx[i]]) - pw.begin();bit.add(k, 1);} else if (t == 2) {int k = lower_bound(all(pw), men[x - 1]) - pw.begin();bit.add(k, -1);} else {B += x;}int l = 0, r = Q + 1;while (r - l > 1) {int m = (l + r) / 2;auto it = lower_bound(all(pw), m - B);if (it == pw.end()) {r = m;} else {int k = it - pw.begin();auto ok = bit.sum(k, P) >= m;if (ok)l = m;else r = m;}}cout << l << endl;}}