たぶんほかの人の回答もあったほうが参考になると思うので、(というか、個人的に書きたかったので)書いてみました。
c++言語があまりよくわからなくて、競技プログラミング避けていたんですが、結構問題見たときに面白いなと思ってチャレンジしてみました。
難しい型とかはわからないので、最低限vectoerだけ勉強して書きました。(queue操作がやりづらかったが)
TODOが残ってますが、考え方として特に清書せずに残しました。
intだとオーバーフローするかもしれないですが、そこらへんは定義域を見て調整すればよいと思いました。
c++
1 # include <bits/stdc++.h>
2 using namespace std ;
3 # define rep ( i , n ) for ( int i = 0 ; i < n ; ++ i )
4 # define ll long long
5
6 int inputQ ( ) {
7 int Q ;
8 cin >> Q ;
9 return Q ;
10 }
11
12 vector < vector < int >> inputTable ( int Q ) {
13
14 vector < vector < int >> table ( Q , vector < int > ( 2 , 0 ) ) ;
15
16 int inputInt1 , inputInt2 ;
17
18 for ( int i = 0 ; i < Q ; ++ i ) {
19 cin >> inputInt1 ;
20 table [ i ] [ 0 ] = inputInt1 ;
21 // 2, 3 の場合は追加で入力を受け付ける
22 if ( inputInt1 == 2 || inputInt1 == 3 ) cin >> inputInt2 , table [ i ] [ 1 ] = inputInt2 ;
23 }
24
25
26 return table ;
27
28 }
29
30 int main ( ) {
31 int Q ;
32 Q = inputQ ( ) ;
33
34 vector < vector < int >> table ( Q , vector < int > ( 2 , 0 ) ) ;
35 table = inputTable ( Q ) ;
36
37 // 入力のprint debug
38 // for (int i = 0; i < table.size(); i ++) {
39 // for (int j = 0; j < table[i].size(); j ++) {
40 // cout << table[i][j];
41 // }
42 // cout << endl;
43 // }
44
45 // return 0;
46
47 // キュー構造として考える
48 vector < vector < int >> storage ( 0 , vector < int > ( 2 , 0 ) ) ;
49
50
51 // TODO 1が何回続いたかを記録する
52 // TODO 2が起きた回数を加算する
53 // TODO 3が起きたら後ろから配列を消す resize(n)メソッドを使用する
54 for ( int i = 0 ; i < Q ; ++ i ) {
55 int tag = table [ i ] [ 0 ] ;
56
57 // Memo: switchを使うと変数のスコープの挙動でエラーを吐く
58 if ( tag == 1 ) {
59 // 初回の種植え、または、育った種がすでにあったら、先頭に新しいものを用意する
60 if ( storage . size ( ) <= 0 || storage [ 0 ] [ 1 ] > 0 ) storage . insert ( storage . begin ( ) , { 0 , 0 } ) ;
61 // 埋められた回数を記録する
62 storage [ 0 ] [ 0 ] = storage [ 0 ] [ 0 ] + 1 ;
63 } else if ( tag == 2 ) {
64 int T = table [ i ] [ 1 ] ;
65 // 各埋められた回数の横に、高さを記録する
66 for ( int j = 0 ; j < storage . size ( ) ; ++ j ) {
67 storage [ j ] [ 1 ] = T ;
68 }
69 } else if ( tag == 3 ) {
70 int H = table [ i ] [ 1 ] ;
71 int result = 0 ;
72 for ( int j = storage . size ( ) - 1 ; j >= 0 ; -- j ) {
73 if ( H <= storage [ j ] [ 1 ] ) {
74 result = result + storage [ j ] [ 0 ] ;
75 storage . resize ( j ) ;
76 } else {
77 // O(N)のためbreakしなくても遅くはない
78 break ;
79 }
80 }
81
82 cout << result << endl ;
83 }
84 }
85
86 // vector<vector<ll>> vec(Q, vector<ll>(2));
87 // vector<pair<ll, ll>> pot(1, {0, 0});
88
89 // rep(i, Q) {
90 // cin >> vec[i][0];
91
92 // if (vec[i][0] == 1) {
93 // if (i != 0 && vec[i - 1][0] == 2) {
94 // pot.push_back({0, 0});
95 // }
96 // else if (pot.empty()) {
97 // pot.push_back({0, 0});
98 // }
99 // pot.back().first++;
100 // }
101 // else if (vec[i][0] == 2) {
102 // cin >> vec[i][1];
103 // if (!pot.empty()) pot.back().second += vec[i][1];
104 // }
105 // else if (vec[i][0] == 3) {
106 // cin >> vec[i][1];
107 // if (pot.empty()) {
108 // cout << 0 << endl;
109 // continue;
110 // }
111
112 // ll height = 0, ans = 0;
113 // bool harvested = false;
114
115 // for (ll j = pot.size() - 1; j >= 0; j--) {
116 // height += pot[j].second;
117 // if (height >= vec[i][1]) {
118 // for (int k = 0; k <= j; k++) {
119 // ans += pot[k].first;
120 // }
121 // cout << ans << endl;
122 // pot.erase(pot.begin(), pot.begin() + j + 1);
123 // harvested = true;
124 // break;
125 // }
126 // }
127
128 // if (!harvested) {
129 // cout << 0 << endl;
130 // }
131 // }
132 // }
133
134 return 0 ;
135 }