记录编号 |
600470 |
评测结果 |
AAAAAAAAAA |
题目名称 |
数列操作η |
最终得分 |
100 |
用户昵称 |
LikableP |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.854 s |
提交时间 |
2025-05-04 17:20:44 |
内存使用 |
4.95 MiB |
显示代码纯文本
#include <cstdio>
#include <algorithm>
#define ls(root) root << 1
#define rs(root) root << 1 | 1
using ::std::min;
const int MAXN = 1e5 + 10;
int n, q;
int b[MAXN];
struct NODE {
int minn = 0;
int ans = 0;
int lazy = 0;
} node[MAXN << 2];
void PushUp(int root) {
node[root].minn = min(node[ls(root)].minn, node[rs(root)].minn);
node[root].ans = node[ls(root)].ans + node[rs(root)].ans;
}
void Build(int root, int lt, int rt) {
if (lt == rt) {
node[root].minn = b[lt];
return ;
}
int mid = lt + ((rt - lt) >> 1);
Build(ls(root), lt, mid);
Build(rs(root), mid + 1, rt);
PushUp(root);
}
void PushDown(int root) {
if (node[root].lazy) {
node[ls(root)].minn += node[root].lazy;
node[ls(root)].lazy += node[root].lazy;
node[rs(root)].minn += node[root].lazy;
node[rs(root)].lazy += node[root].lazy;
node[root].lazy = 0;
}
}
void AddSeq(int root, int lt, int rt, int lq, int rq, int val) {
if (lt == lq && rt == rq) {
node[root].minn += val;
node[root].lazy += val;
if (node[root].minn <= 0) {
if (lt == rt) {
node[root].ans++;
node[root].minn = b[lt];
node[root].lazy = 0;
} else {
PushDown(root);
int mid = lt + ((rt - lt) >> 1);
AddSeq(ls(root), lt, mid, lt, mid, 0);
AddSeq(rs(root), mid + 1, rt, mid + 1, rt, 0);
PushUp(root);
}
}
return ;
}
PushDown(root);
int mid = lt + ((rt - lt) >> 1);
if (rq <= mid) {
AddSeq(ls(root), lt, mid, lq, rq, val);
} else if (lq > mid) {
AddSeq(rs(root), mid + 1, rt, lq, rq, val);
} else {
AddSeq(ls(root), lt, mid, lq, mid, val);
AddSeq(rs(root), mid + 1, rt, mid + 1, rq, val);
}
PushUp(root);
}
int Query(int root, int lt, int rt, int lq, int rq) {
if (lt == lq && rt == rq) {
return node[root].ans;
}
PushDown(root);
int mid = lt + ((rt - lt) >> 1);
if (rq <= mid) {
return Query(ls(root), lt, mid, lq, rq);
} else if (lq > mid) {
return Query(rs(root), mid + 1, rt, lq, rq);
} else {
return Query(ls(root), lt, mid, lq, mid) + Query(rs(root), mid + 1, rt, mid + 1, rq);
}
}
int main() {
freopen("eta.in", "r", stdin);
freopen("eta.out", "w", stdout);
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; ++i) {
scanf("%d", &b[i]);
}
Build(1, 1, n);
while (q--) {
char op[10];
int l, r;
scanf("%s %d %d", op, &l, &r);
if (op[0] == 'a') {
AddSeq(1, 1, n, l, r, -1);
} else {
printf("%d\n", Query(1, 1, n, l, r));
}
}
return 0;
}