#include<bits/stdc++.h>
#include<fstream>
using namespace std;
#define ll long long
#define vt vector
#define pb push_back
#define fi first
#define se second
#define forr(i, a, b) for(int i = a; i < b; i++)
#define dorr(i, a, b) for(int i = a; i >= b; i--)
#define pii pair<int, int>
#define pll pair<ll, ll>
#define int long long
const int mxn = 1e5 + 3;
const int inf = 1e7;
int n, q;
int mx[4 * mxn + 1], lz[4 * mxn + 1], a[mxn + 1];
void push(int nd){
mx[nd * 2] += lz[nd]; mx[nd * 2 + 1] += lz[nd]; lz[nd * 2] += lz[nd];
lz[nd * 2 + 1] += lz[nd]; lz[nd] = 0;
}
void upd(int nd, int l, int r, int ql, int qr, int v){
if(ql > r || qr < l)return;
if(ql <= l && qr >= r){
mx[nd] += v; lz[nd] += v;
return;
}
int mid = (l + r) >> 1;
push(nd);
upd(nd * 2, l, mid, ql, qr, v); upd(nd * 2 + 1, mid + 1, r, ql, qr, v);
mx[nd] = max(mx[nd * 2], mx[nd * 2 + 1]);
}
int getv(int nd, int l, int r, int id){
if(l == r)return(mx[nd]);
int mid = (l + r) >> 1;
push(nd);
if(id <= mid)return(getv(nd * 2, l, mid, id));
else return(getv(nd * 2 + 1, mid + 1, r, id));
}
int findl(int nd, int l, int r, int h){
if(l == r)return(l);
int mid = (l + r) >> 1;
push(nd);
if(mx[nd * 2] >= h){
return(findl(nd * 2, l, mid, h));
}else{
return(findl(nd * 2 + 1, mid + 1, r, h));
}
}
int findr(int nd, int l, int r, int h){
if(l == r)return(r - 1);
int mid = (l + r) >> 1;
push(nd);
if(mx[nd * 2] > h){
return(findr(nd * 2, l, mid, h));
}else{
return(findr(nd * 2 + 1, mid + 1, r, h));
}
}
void add(int c, int h){
int l = findl(1, 1, n + 1, h);
if(l == n + 1)return;
int r = min(l + c - 1, n), v = getv(1, 1, n + 1, r);
int rl = findl(1, 1, n + 1, v), rr = findr(1, 1, n + 1, v);
if(l == rl){
upd(1, 1, n + 1, max(rr - c + 1, l), rr, 1);
}else{
upd(1, 1, n + 1, l, rl - 1, 1);
int lft = rr - (c - (rl - l)) + 1;
assert(lft >= rl);
upd(1, 1, n + 1, lft, rr, 1);
}
}
signed main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> q;
for(int i = 1; i <= n; i++)cin >> a[i];
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i++)upd(1, 1, n + 1, i, i, a[i]);
forr(i, 0, q){
char idq; cin >> idq;
if(idq == 'F'){
int c, h; cin >> c >> h;
add(c, h);
/*
for(int j = 1; j <= n; j++)cout << getv(1, 1, n + 1, j) << " ";
cout << "\n";
*/
}else{
int l, r; cin >> l >> r;
cout << findr(1, 1, n + 1, r) - findl(1, 1, n + 1, l) + 1 << "\n";
}
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
32 ms |
10188 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
2 ms |
340 KB |
Output is correct |
3 |
Runtime error |
1 ms |
596 KB |
Execution killed with signal 6 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
10 ms |
1108 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
4 ms |
1112 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
26 ms |
5684 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
28 ms |
9996 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
34 ms |
10040 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
36 ms |
10096 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
43 ms |
10148 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
41 ms |
10396 KB |
Execution killed with signal 6 |
2 |
Halted |
0 ms |
0 KB |
- |