#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2")
using namespace std;
#define ll long long
#define endl '\n'
#define FF first
#define SS second
#define all(a) a.begin(), a.end()
#define mod (ll)(1000000007)
const int inf = 1e9;
int main() {
ios_base::sync_with_stdio(0);cin.tie(0);
int n;
cin >> n;
map<int, int> Nxt, Prv;
set<array<int, 2>> st;
st.insert({0, inf + 1});
while (n--) {
int a, b;
cin >> a >> b;
auto ind = st.upper_bound({a, 2 * inf});
ind--;
auto cur = *ind;
if (a >= cur[0] && a <= cur[1]) {
st.erase(ind);
if (a - 1 >= cur[0]) {
st.insert({cur[0], a - 1});
}
if (a + 1 <= cur[1]) {
st.insert({a + 1, cur[1]});
}
}
swap(a, b);
ind = st.upper_bound({a, 2 * inf});
ind--;
cur = *ind;
if (a >= cur[0] && a <= cur[1]) {
st.erase(ind);
if (a - 1 >= cur[0]) {
st.insert({cur[0], a - 1});
}
if (a + 1 <= cur[1]) {
st.insert({a + 1, cur[1]});
}
}
swap(a, b);
if (!Prv[a]) {
Prv[a] = a - 1;
Nxt[a - 1] = a;
}
if (!Prv[b]) {
Prv[b] = b - 1;
Nxt[b - 1] = b;
}
if (!Nxt[a]) {
Nxt[a] = a + 1;
Prv[a + 1] = a;
}
if (!Nxt[b]) {
Nxt[b] = b + 1;
Prv[b + 1] = b;
}
Nxt[Prv[a]] = Nxt[a], Prv[Nxt[a]] = Prv[a];
Nxt[Prv[b]] = a, Prv[a] = Prv[b];
Nxt[a] = b, Prv[b] = a;
}
vector<int> Pos, Val;
int q;
cin >> q;
vector<array<int, 2>> Q(q);
for (int i = 0; i < q; i++) {
char kind;
int cur;
cin >> kind >> cur;
if (kind == 'P') {
Q[i][0] = 0;
Val.push_back(cur);
}
else {
Q[i][0] = 1;
Pos.push_back(cur);
}
Q[i][1] = cur;
}
int pos = 0, val = 0;
sort(all(Pos));
sort(all(Val));
if (!Nxt[0]) {
Nxt[0] = 1;
}
if (!Nxt[inf]) {
Nxt[inf] = inf + 1;
}
vector<array<int, 2>> Ans;
map<int, int> Ansv, Ansp;
int cur_val = 0, cur_ind = 0, done = 0;
while (done < q) {
if (Nxt.count(cur_val)) {
int lv = cur_val, rv = cur_val;
int lp = cur_ind, rp = cur_ind;
int idx = lower_bound(all(Val), lv) - Val.begin();
while (idx < Val.size() && Val[idx] <= rv) {
Ansp[Val[idx]] = cur_ind;
idx++;
done++;
}
idx = lower_bound(all(Pos), lp) - Pos.begin();
while (idx < Pos.size() && Pos[idx] <= rp) {
Ansv[Pos[idx]] = cur_val;
idx++;
done++;
}
cur_val = Nxt[cur_val];
cur_ind++;
continue;
}
auto ind = st.upper_bound({cur_val, 2 * inf});
ind--;
auto cur = *ind;
int lv = cur_val, rv = cur[1] - 1;
int lp = cur_ind, rp = cur_ind + cur[1] - cur_val - 1;
int idx = lower_bound(all(Val), lv) - Val.begin();
while (idx < Val.size() && Val[idx] <= rv) {
Ansp[Val[idx]] = cur_ind + Val[idx] - lv;
idx++;
done++;
}
idx = lower_bound(all(Pos), lp) - Pos.begin();
while (idx < Pos.size() && Pos[idx] <= rp) {
Ansv[Pos[idx]] = cur_val + Pos[idx] - lp;
idx++;
done++;
}
cur_ind += cur[1] - cur_val;
cur_val = cur[1];
}
for (int i = 0; i < q; i++) {
if (!Q[i][0]) {
cout << Ansp[Q[i][1]] << endl;
}
else {
cout << Ansv[Q[i][1]] << endl;
}
}
}
Compilation message
queue.cpp: In function 'int main()':
queue.cpp:112:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
112 | while (idx < Val.size() && Val[idx] <= rv) {
| ~~~~^~~~~~~~~~~~
queue.cpp:118:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
118 | while (idx < Pos.size() && Pos[idx] <= rp) {
| ~~~~^~~~~~~~~~~~
queue.cpp:133:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
133 | while (idx < Val.size() && Val[idx] <= rv) {
| ~~~~^~~~~~~~~~~~
queue.cpp:139:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
139 | while (idx < Pos.size() && Pos[idx] <= rp) {
| ~~~~^~~~~~~~~~~~
queue.cpp:93:9: warning: unused variable 'pos' [-Wunused-variable]
93 | int pos = 0, val = 0;
| ^~~
queue.cpp:93:18: warning: unused variable 'val' [-Wunused-variable]
93 | int pos = 0, val = 0;
| ^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
2 ms |
348 KB |
Output is correct |
4 |
Correct |
4 ms |
636 KB |
Output is correct |
5 |
Correct |
29 ms |
4948 KB |
Output is correct |
6 |
Correct |
38 ms |
5848 KB |
Output is correct |
7 |
Correct |
52 ms |
6476 KB |
Output is correct |
8 |
Correct |
78 ms |
8408 KB |
Output is correct |
9 |
Correct |
78 ms |
8400 KB |
Output is correct |
10 |
Correct |
86 ms |
8960 KB |
Output is correct |
11 |
Correct |
206 ms |
11448 KB |
Output is correct |
12 |
Correct |
179 ms |
8500 KB |
Output is correct |
13 |
Correct |
197 ms |
12112 KB |
Output is correct |
14 |
Correct |
216 ms |
12116 KB |
Output is correct |
15 |
Correct |
217 ms |
12368 KB |
Output is correct |
16 |
Correct |
206 ms |
12404 KB |
Output is correct |
17 |
Correct |
24 ms |
2248 KB |
Output is correct |
18 |
Correct |
46 ms |
3668 KB |
Output is correct |
19 |
Correct |
74 ms |
3556 KB |
Output is correct |
20 |
Correct |
116 ms |
6416 KB |
Output is correct |
21 |
Execution timed out |
1061 ms |
13440 KB |
Time limit exceeded |
22 |
Correct |
202 ms |
16392 KB |
Output is correct |
23 |
Correct |
302 ms |
20176 KB |
Output is correct |
24 |
Correct |
279 ms |
20300 KB |
Output is correct |
25 |
Correct |
244 ms |
14796 KB |
Output is correct |