結果
問題 | No.618 labo-index |
ユーザー |
![]() |
提出日時 | 2017-12-18 11:08:01 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,865 ms / 6,000 ms |
コード長 | 2,943 bytes |
コンパイル時間 | 2,085 ms |
コンパイル使用メモリ | 180,968 KB |
実行使用メモリ | 5,888 KB |
最終ジャッジ日時 | 2024-12-15 23:42:37 |
合計ジャッジ時間 | 15,984 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
ソースコード
#include "bits/stdc++.h"using namespace std;#define DEBUG(x) cout<<#x<<": "<<x<<endl;#define DEBUG_VEC(v) cout<<#v<<":";for(int i=0;i<v.size();i++) cout<<" "<<v[i]; cout<<endltypedef long long ll;#define vi vector<int>#define vl vector<ll>#define vii vector< vector<int> >#define vll vector< vector<ll> >#define vs vector<string>#define pii pair<int,int>#define pll pair<ll, ll>#define pis pair<int,string>#define psi pair<string,int>const int inf = 1000000001;const ll INF = 1e18 * 2;#define MOD 1000000007#define mod 1000000009#define pi 3.14159265358979323846#define Sp(p) cout<<setprecision(15)<<fixed<<p<<endl;int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 };int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 };const ll none = -200000000000000;int main() {int q, i, j;scanf("%d", &q);int block = sqrt(q);vector<vector<pll> > lab;lab.push_back(vector<pll>());vl add;int num = 0;//DEBUG(block)ll pre = 0;for (int unko = 0; unko < q; unko++) {int t, x;scanf("%d%d", &t, &x);if (t == 1) {lab[num / block].push_back(pll(x, num));if (lab[num / block].size() == block) {lab.push_back(vector<pll>());add.push_back(0);}sort(lab[num / block].begin(), lab[num / block].end());num++;}else if (t == 2) {x--;i = x / block;for (j = 0; j < lab[i].size(); j++) {if (lab[i][j].second == x) {lab[i][j].first += none;break;}}sort(lab[i].begin(), lab[i].end());}else {for (i = 0; i < add.size(); i++) {add[i] += x;}for (j = 0; j < lab[lab.size() - 1].size(); j++) {lab[lab.size() - 1][j].first += x;}}ll left, right;if (t == 1) {left = pre; right = pre + 2;}else if (t == 2) {left = pre - 1; right = pre + 2;}else {if (x >= 0) {left = pre; right = num + 2;}else {left = 0; right = pre + 2;}}while (left + 1 < right) {ll mid = (left + right) / 2;int cnt = 0;for (i = 0; i < add.size(); i++) {int idx = lower_bound(lab[i].begin(), lab[i].end(), pll(mid - add[i], -1)) - lab[i].begin();cnt += block - idx;}int idx = lower_bound(lab[lab.size() - 1].begin(), lab[lab.size() - 1].end(), pll(mid, -1)) - lab[lab.size() - 1].begin();cnt += lab[lab.size() - 1].size() - idx;if (cnt >= mid) {left = mid;}else {right = mid;}}printf("%lld\n", left);pre = left;/*for (i = 0; i < lab.size(); i++) {for (j = 0; j < lab[i].size(); j++) {printf("(%lld, %lld) ", lab[i][j].first, lab[i][j].second);}cout << endl;}*/}}/*51 11 21 31 41 541 11 21 32 251 11 21 33 23 -10101 3965797651 7981355581 9011291143 -9294249192 31 -6436094883 6970312583 -2457465331 -8044493622 2*/