记录编号 600470 评测结果 AAAAAAAAAA
题目名称 数列操作η 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 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;
}