#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
using namespace std;
// using namespace __gnu_pbds;
#define SPEED \
ios_base::sync_with_stdio(0); \
cin.tie(NULL); \
cout.tie(NULL);
#define pb push_back
#define ins insert
#define fi first
#define se second
#define endl "\n"
#define ALL(x) x.begin(), x.end()
#define sz(x) x.size()
#define intt int
const intt mod = 1e9 + 7;
const intt base = 9973;
const intt inf = 1e9;
const intt mxN = 5e5 + 5;
const intt L = 21;
vector<intt> segmax(4 * mxN), segmin(4 * mxN);
vector<intt> lazy(4 * mxN), A(mxN);
void build(intt node, intt l, intt r) {
if(l == r) {
segmax[node] = segmin[node] = A[l];
lazy[node] = 0;
return;
}
intt mid = (l + r) / 2;
build(node * 2, l, mid);
build(node * 2 + 1, mid + 1, r);
segmax[node] = max(segmax[node * 2], segmax[node * 2 + 1]);
segmin[node] = min(segmin[node * 2], segmin[node * 2 + 1]);
}
void push(intt node, intt l, intt r){
if(lazy[node] == 0) return;
segmax[node] += lazy[node];
segmin[node] += lazy[node];
if(l != r) {
lazy[node * 2] += lazy[node];
lazy[node * 2 + 1] += lazy[node];
}
lazy[node] = 0;
}
void update(intt node, intt l, intt r, intt ql, intt qr){
push(node, l, r);
if(ql > r || qr < l || ql > qr) return;
if(ql <= l && r <= qr) {
lazy[node]++;
push(node, l, r);
return;
}
intt mid = (l + r) / 2;
update(node * 2, l, mid, ql, qr);
update(node * 2 + 1, mid + 1, r, ql, qr);
segmax[node] = max(segmax[node * 2], segmax[node * 2 + 1]);
segmin[node] = min(segmin[node * 2], segmin[node * 2 + 1]);
}
intt rett = 0;
intt get_cbii(intt node, intt l, intt r, intt val) {
push(node, l, r);
if(l == r) {
if(segmin[node] > val) {
rett = l;
} else {
rett = 0;
}
return rett;
}
intt mid = (l + r) / 2;
if(segmax[node * 2] <= val && segmax[node * 2 + 1] <= val) {
rett = 0;
return rett;
}
if(segmax[node * 2] > val) {
get_cbii(node * 2, l, mid, val);
} else {
get_cbii(node * 2 + 1, mid + 1, r, val);
}
}
intt get_cbeb(intt node, intt l, intt r, intt idx) {
push(node, l, r);
if(l == r) {
return segmax[node];
}
intt mid = (l + r) / 2;
if(idx <= mid) {
return get_cbeb(node * 2, l, mid, idx);
} else {
return get_cbeb(node * 2 + 1, mid + 1, r, idx);
}
}
void solve() {
intt N, Q;
cin >> N >> Q;
A.assign(N + 1, 0ll);
for(intt i = 1; i <= N; i++) {
cin >> A[i];
}
sort(ALL(A));
build(1, 1, N);
while(Q--) {
char c;
cin >> c;
if(c == 'F') {
intt H, C;
cin >> C >> H;
intt l = get_cbii(1, 1, N, H - 1);
intt r = min(N, l + C - 1);
if(l == -1) {
rett = 0;
continue;
}
intt eded = get_cbeb(1, 1, N, r);
intt ilk = get_cbii(1, 1, N, --eded);
eded++;
update(1, 1, N, l, ilk - 1);
intt kicikler = (ilk - l);
intt son = get_cbii(1, 1, N, eded) - 1;
if(son == -2) son = N;
update(1, 1, N, son - (C - kicikler - 1), son);
// cout << l << " " << r << " " << eded << " " << ilk << " " << kicikler << " " << son << endl;
rett = 0;
} else {
intt l , r;
cin >> l >> r;
intt bbii = get_cbii(1, 1, N, l - 1);
intt cbii = get_cbii(1, 1, N, r) - 1;
// cout << "ASD:: " << bbii << " " << cbii << endl;
if(bbii == -1) {
cout << 0 << endl;
rett = 0;
continue;
}
if(cbii == -2) {
cbii = N;
}
cout << max(0, cbii - bbii+1) << endl;
rett = 0;
}
}
// 1 2 3 3 5
// 2 2 3 3 3 4 4 4
}
signed main() {
SPEED;
intt tst = 1;
// cin >> tst;
while (tst--) {
solve();
}
}
/*
Bize lazimdi bir ededden ciddi boyuk olan ilk yeri tapaq, ciddi kicik olan ilk yeri tapaq
Bize lazimdi lazy update
Bu ikisini necese handle ede bilsek olacaq bomba -> elebil update edende bize lazimdiki H-a beraber olan axrinci ededleri edek, qalanlari ise eyni qalacaq
Bize lazimdi bizden boyuk nece dene *mecbur* update olunacaq ededlerin sayi -> max(0, C[i] - equals); equals = birinci yazdigimla tapa bilerik
*/
컴파일 시 표준 에러 (stderr) 메시지
grow.cpp: In function 'int get_cbii(int, int, int, int)':
grow.cpp:95:1: warning: control reaches end of non-void function [-Wreturn-type]
95 | }
| ^
# | 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... |
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |