记录编号 600233 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 [CF 121E] 幸运数列 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 8.139 s
提交时间 2025-04-22 20:04:37 内存使用 1.97 MiB
显示代码纯文本
#include <cstdio>

const int MAXN = 1e5 + 10; 

bool ok[10000]; 
int n, m;
int a[MAXN];
int tree[MAXN];

void dfs(int now) {
	if (now * 10 + 4 < 10000) {
		ok[now * 10 + 4] = true;
		dfs(now * 10 + 4);
	}
	if (now * 10 + 7 < 10000) {
	    ok[now * 10 + 7] = true;
	    dfs(now * 10 + 7);
	}
	return ;
}

void Add(int x, int y) {
	for (; x <= n; x += (x & -x)) tree[x] += y;
}

int Get(int x) {
	int res = 0;
	for (; x; x -= (x & -x)) res += tree[x];
	return res;
}

int main() {
	freopen("cf121e.in", "r", stdin);
	freopen("cf121e.out", "w", stdout);
	dfs(0);
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
		if (ok[a[i]]) Add(i, 1);
	}
	while (m--) {
		char op[10]; int l, r, d;
		scanf("%s %d %d", op, &l, &r);
		if (op[0] == 'a') {
			scanf("%d", &d);
			for (int i = l; i <= r; ++i) {
				if (ok[a[i]]) Add(i, -1);
				a[i] += d;
				if (ok[a[i]]) Add(i, 1);
			}
		} else {
			printf("%d\n", Get(r) - Get(l - 1));
		}
	} 
	return 0;
}