#include <bits/stdc++.h>
#define eb emplace_back
#define mp make_pair
#define F first
#define S second
#define printv(a, b) {\
for(auto pv : a) b << pv << " ";\
b << "\n";\
}
using namespace std;
using pii = pair<int, int>;
ostream& operator<<(ostream& o, pii p){
return o << '(' << p.F << ',' << p.S << ')';
}
bool assertflag = false;
void waassert(bool t){
if(!assertflag || t) return;
cout << "OAO\n";
exit(0);
}
struct Node{
int mn = 0, mx = 0, tag = -1, d = -1, sz;
int l = -1, r = -1;
int rmn(){
if(tag == -1) return mn;
return min(tag, tag + d * (sz - 1));
}
int rmx(){
if(tag == -1) return mx;
return max(tag, tag + d * (sz - 1));
}
};
struct SegmentTree{
vector<Node> st;
int ts = 0;
int lr, rr;
void init(int n, int _lr, int _rr){
st.resize(2 * n);
lr = _lr;
rr = _rr;
}
void push(int id){
if(st[id].tag == -1) return;
int lc = st[id].l, rc = st[id].r;
st[lc].tag = st[id].tag;
st[rc].tag = st[id].tag + st[id].d * st[lc].sz;
st[lc].d = st[rc].d = st[id].d;
st[id].mn = st[id].rmn();
st[id].mx = st[id].rmx();
st[id].tag = st[id].d = -1;
}
int build(int l = -1, int r = -1){
if(l == -1) l = lr;
if(r == -1) r = rr;
int id = ts++;
st[id].sz = r - l + 1;
if(l == r) return id;
int m = (l + r) / 2;
st[id].l = build(l, m);
st[id].r = build(m + 1, r);
return id;
}
void modify(int l, int r, int f, int d = 0, int L = -1, int R = -1, int id = 0){
if(L == -1) L = lr;
if(R == -1) R = rr;
//cerr << "modify " << l << " " << r << " " << f << " " << d << " " << L << " " << R << "\n";
//waassert(L <= l && r <= R && l <= r);
if(l == L && r == R){
st[id].tag = f;
st[id].d = d;
return;
}
push(id);
int M = (L + R) / 2;
if(r <= M) modify(l, r, f, d, L, M, st[id].l);
else if(l > M) modify(l, r, f, d, M + 1, R, st[id].r);
else{
modify(l, M, f, d, L, M, st[id].l);
modify(M + 1, r, f + d * (M + 1 - l), d, M + 1, R, st[id].r);
}
st[id].mn = min(st[st[id].l].rmn(), st[st[id].r].rmn());
st[id].mx = max(st[st[id].l].rmx(), st[st[id].r].rmx());
}
int querymn(int l, int r, int L = -1, int R = -1, int id = 0){
if(L == -1) L = lr;
if(R == -1) R = rr;
waassert(L <= l && r <= R && l <= r);
if(l == L && r == R) return st[id].rmn();
push(id);
int M = (L + R) / 2;
if(r <= M) return querymn(l, r, L, M, st[id].l);
else if(l > M) return querymn(l, r, M + 1, R, st[id].r);
else{
return min(querymn(l, M, L, M, st[id].l), querymn(M + 1, r, M + 1, R, st[id].r));
}
}
int querymx(int l, int r, int L = -1, int R = -1, int id = 0){
if(L == -1) L = lr;
if(R == -1) R = rr;
waassert(L <= l && r <= R && l <= r);
if(l == L && r == R) return st[id].rmx();
push(id);
int M = (L + R) / 2;
if(r <= M) return querymx(l, r, L, M, st[id].l);
else if(l > M) return querymx(l, r, M + 1, R, st[id].r);
else{
return max(querymx(l, M, L, M, st[id].l), querymx(M + 1, r, M + 1, R, st[id].r));
}
}
};
int n, a;
void assertrange(int l, int r){
waassert(l <= r && 1 <= l && r <= n);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> a;
SegmentTree pos, order;
pos.init(n, 1, n);
order.init(n, 1, n);
pos.build();
order.build();
vector<int> d(n + 1);
map<int, int, greater<>> rk;
for(int i = 1; i <= n; i++){
cin >> d[i];
rk[d[i]] = i;
}
int l = a, r = a;
pos.modify(a, a, 1);
order.modify(1, 1, a);
//printv(d, cerr);
//printv(rk, cerr);
for(int i = 2; i <= n; i++){
if(r == n){
l--;
pos.modify(l, l, i);
order.modify(i, i, l);
//cerr << l << " " << i << "\n";
}
else if(l == 1){
r++;
pos.modify(r, r, i);
order.modify(i, i, r);
//cerr << r << " " << i << "\n";
}
else if(d[l - 1] < d[r + 1]){
l--;
pos.modify(l, l, i);
order.modify(i, i, l);
//cerr << l << " " << i << "\n";
}
else{
r++;
pos.modify(r, r, i);
order.modify(i, i, r);
//cerr << r << " " << i << "\n";
}
}
//cerr << "pos ";
//for(int i = 1; i <= n; i++) cerr << pos.querymn(i, i) << " ";
//cerr << "\n";
//cerr << "order ";
//for(int i = 1; i <= n; i++) cerr << order.querymn(i, i) << " ";
//cerr << "\n";
int q;
cin >> q;
while(q--){
char c;
cin >> c;
if(c == 'F'){
int b;
cin >> b;
cout << pos.querymn(b, b) - 1 << "\n";
continue;
}
int i, e;
cin >> i >> e;
//cerr << "start " << i << " " << e << "\n";
vector<int> tmp;
for(int j = 0; j < e - 1; j++){
tmp.eb(rk.begin()->S);
rk.erase(rk.begin());
}
tmp.eb(i);
rk.erase(d[i]);
while(!tmp.empty()){
d[tmp.back()] = rk.empty() ? 1 : rk.begin()->F + 1;
rk[d[tmp.back()]] = tmp.back();
tmp.pop_back();
}
//printv(rk, cerr);
int now = i;
int nowpos = pos.querymn(now, now);
if(nowpos == 1) continue;
assertflag = true;
waassert(nowpos != 0);
assertflag = false;
while(true){
int l = order.querymn(1, nowpos - 1), r = order.querymx(1, nowpos - 1);
//cerr << "test " << now << " " << l << " " << r << "\n";
if(now == l - 1){
int go = n + 1;
for(auto it = rk.begin(); it->S != now; it++){
if(it->S > r) go = min(go, it->S);
}
if(go - 1 > r){
//assertrange(r + 1, go - 1);
//assertrange(nowpos, nowpos + (go - 1) - (r + 1));
pos.modify(r + 1, go - 1, nowpos, 1);
order.modify(nowpos, nowpos + (go - 1) - (r + 1), r + 1, 1);
nowpos += go - 1 - r;
}
pos.modify(now, now, nowpos);
order.modify(nowpos, nowpos, now);
nowpos++;
if(go != n + 1) now = go;
else if(now == 1) break;
else{
pos.modify(1, now - 1, nowpos + now - 2, -1);
order.modify(nowpos, n, now - 1, -1);
break;
}
}
else{
int go = 0;
for(auto it = rk.begin(); it->S != now; it++){
if(it->S < l) go = max(go, it->S);
}
if(go + 1 < l){
//assertrange(go + 1, l - 1);
//assertrange(nowpos, nowpos + (l - 1) - (go + 1));
pos.modify(go + 1, l - 1, nowpos + (l - 1) - (go + 1), -1);
order.modify(nowpos, nowpos + (l - 1) - (go + 1), l - 1, -1);
nowpos += l - 1 - go;
}
pos.modify(now, now, nowpos);
order.modify(nowpos, nowpos, now);
nowpos++;
if(go != 0) now = go;
else if(now == n) break;
else{
pos.modify(now + 1, n, nowpos, 1);
order.modify(nowpos, n, now + 1, 1);
break;
}
}
}
//cerr << "pos ";
//for(int i = 1; i <= n; i++) cerr << pos.querymn(i, i) << " ";
//cerr << "\n";
//cerr << "order ";
//for(int i = 1; i <= n; i++) cerr << order.querymn(i, i) << " ";
//cerr << "\n";
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
308 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
2 ms |
332 KB |
Output is correct |
4 |
Correct |
21 ms |
520 KB |
Output is correct |
5 |
Correct |
55 ms |
2064 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1892 ms |
2952 KB |
Output is correct |
2 |
Correct |
1417 ms |
3108 KB |
Output is correct |
3 |
Correct |
1981 ms |
3112 KB |
Output is correct |
4 |
Correct |
1293 ms |
3108 KB |
Output is correct |
5 |
Execution timed out |
2081 ms |
5352 KB |
Time limit exceeded |
6 |
Correct |
1852 ms |
5480 KB |
Output is correct |
7 |
Execution timed out |
2085 ms |
5436 KB |
Time limit exceeded |
8 |
Correct |
1421 ms |
5436 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
168 ms |
17836 KB |
Output is correct |
2 |
Correct |
140 ms |
17808 KB |
Output is correct |
3 |
Correct |
128 ms |
17624 KB |
Output is correct |
4 |
Correct |
1 ms |
208 KB |
Output is correct |
5 |
Correct |
412 ms |
42148 KB |
Output is correct |
6 |
Correct |
412 ms |
42396 KB |
Output is correct |
7 |
Correct |
283 ms |
42048 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
134 ms |
1300 KB |
Output is correct |
2 |
Correct |
128 ms |
1604 KB |
Output is correct |
3 |
Correct |
333 ms |
9352 KB |
Output is correct |
4 |
Correct |
342 ms |
9196 KB |
Output is correct |
5 |
Correct |
376 ms |
2216 KB |
Output is correct |
6 |
Correct |
575 ms |
12520 KB |
Output is correct |
7 |
Correct |
454 ms |
3824 KB |
Output is correct |
8 |
Correct |
1193 ms |
17348 KB |
Output is correct |
9 |
Execution timed out |
2081 ms |
43088 KB |
Time limit exceeded |
10 |
Correct |
1231 ms |
3208 KB |
Output is correct |
11 |
Correct |
1465 ms |
6876 KB |
Output is correct |
12 |
Execution timed out |
2072 ms |
34928 KB |
Time limit exceeded |
13 |
Execution timed out |
2089 ms |
43468 KB |
Time limit exceeded |