分块,#62 TLE。
代码:
#include <string>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
constexpr int N = 1e5 + 5, M = 330;
int a[N], len;
int f[M];
inline int get(register const int& x)
{
return (x - 1) / len;
}
inline int lplace(register const int& x)
{
return x * len + 1;
}
inline int rplace(register const int& x)
{
return lplace(x + 1) - 1;
}
int p[] = { 4, 7, 44, 47, 74, 77, 444, 447, 474, 477, 744, 747, 774, 777, 4444, 4447, 4474, 4477, 4744, 4747, 4774, 4777, 7444, 7447, 7474, 7477, 7744, 7747, 7774, 7777 };
bool flag[N];
int main()
{
register int n, m;
scanf("%d%d", &n, &m);
len = sqrt(n);
for (register int i(0); i < 30; i = -~i) flag[p[i]] = true;
for (register int i(1); i <= n; i = -~i) scanf("%d", &a[i]);
for (register int i(1); i <= n; i = -~i)
{
flag[a[i]] ? ++f[get(i)] : 1;
}
while (m--)
{
string ch;
cin >> ch;
if (ch[0] == 'a')
{
register int l, r, d;
scanf("%d%d%d", &l, &r, &d);
for (register int i(l); i <= r; i = -~i)
{
register int place(get(i));
f[place] -= flag[a[i]];
a[i] += d;
f[place] += flag[a[i]];
}
}
else
{
register int sum = 0, l, r;
scanf("%d%d", &l, &r);
register int ls(get(l)), rs(get(r));
if (ls == rs)
{
for (register int i(l); i <= r; i = -~i) sum += flag[a[i]];
}
else
{
register int lp = lplace(ls + 1), rp = rplace(rs - 1);
for (register int i(l); i < lp; i = -~i) sum += flag[a[i]];
for (register int i(rp + 1); i <= r; i = -~i) sum += flag[a[i]];
register int nl(get(lp)), nr(get(rp));
for (register int i(nl); i <= nr; i++)
{
sum += f[i];
}
}
printf("%d\n", sum);
}
}
return 0;
}