이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int mxN = 250001;
int n, A;
long long a[mxN];
struct IT {
struct Nds {
int L, H, pos;
long long x;
} nds[mxN << 2];
int leaf[mxN];
Nds merge(Nds a, Nds b) {
Nds c;
c.L = a.L; c.H = b.H;
if (a.x >= b.x + (a.L < A)) {
c.x = a.x; c.pos = a.pos;
}
else {
c.x = b.x; c.pos = b.pos;
}
return c;
}
void build(int x, int lo, int hi) {
nds[x].L = lo, nds[x].H = hi;
if (lo == hi) {
leaf[hi] = x;
nds[x].x = a[hi];
nds[x].pos = hi;
return ;
}
int mid = (lo + hi) >> 1;
build(x << 1, lo, mid);
build(x << 1 | 1, mid + 1, hi);
nds[x] = merge(nds[x << 1], nds[x << 1 | 1]);
}
void upd(int pos, long long val) {
int x = leaf[pos];
for (nds[x].x = val, x >>= 1; x; x >>= 1) {
nds[x] = merge(nds[x << 1], nds[x << 1 | 1]);
}
}
long long get_mx(int l, int r, int x = 1) {
if (nds[x].L > r || nds[x].H < l) {
return 0;
}
if (nds[x].L >= l && nds[x].H <= r) {
return nds[x].x;
}
return max(get_mx(l, r, x << 1), get_mx(l, r, x << 1 | 1));
}
int get_pos1(int l, int r, long long val, int x = 1) {
if (nds[x].L > r || nds[x].H < l) {
return -1;
}
if (nds[x].x < val) {
return -1;
}
if (nds[x].L >= l && nds[x].H <= r) {
return nds[x].pos;
}
int res = get_pos1(l, r, val, x << 1 | 1);
if (res >= 0) {
return res;
}
return get_pos1(l, r, val, x << 1);
}
int get_pos2(int l, int r, long long val, int x = 1) {
if (nds[x].L > r || nds[x].H < l) {
return n;
}
if (nds[x].x < val) {
return n;
}
if (nds[x].L >= l && nds[x].H <= r) {
return nds[x].pos;
}
int res = get_pos2(l, r, val, x << 1);
if (res < n) {
return res;
}
return get_pos2(l, r, val, x << 1 | 1);
}
} its;
long long cur[mxN];
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> A; A--;
for (int i = 0; i < n; i++) {
cin >> a[i]; a[i]--;
}
int q; cin >> q;
q++;
for (int i = 0; i < n; i++) {
cur[a[i]] = a[i] * q;
a[i] = cur[a[i]];
//cout << a[i] << " ";
}
its.build(1, 0, n - 1);
//cout << its.nds[1].x << "\n";
char type; int e, x;
while (--q) {
cin >> type >> x; x--;
if (type == 'E') {
cin >> e;
cur[n - e]++;
//cout << x << " " << cur[n - e] << "\n";
its.upd(x, cur[n - e]);
}
else {
if (x == A) {
cout << "0\n";
}
else {
if (A == 0 || A == n - 1) {
cout << abs(x - A) << "\n";
}
else {
if (x > A) {
//cout << its.get_mx(A + 1, x) << " ";
//cout << its.get_pos1(0, A - 1, its.get_mx(A + 1, x)) << " ";
cout << x - 1 - its.get_pos1(0, A - 1, its.get_mx(A + 1, x)) << "\n";
}
else {
/*cout << its.get_mx(x, A - 1) << " ";
cout << its.get_pos2(A + 1, n - 1, 0) << " ";*/
cout << its.get_pos2(A + 1, n - 1, its.get_mx(x, A - 1)) - x - 1 << "\n";
}
}
}
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |