Rt,打了一个普普通通的分块,时间复杂度是 O(Mn) 的,带入极限数据约为 1.2×109,按理来说铁定会超时,但是直接过了。。。所以是数据水了吗?贴一下代码(问完就删):
#include <cstdio>
#include <cmath>
template <typename T, const int _size> class block
{
protected:
int len, id[_size + 5];
T sum[_size + 5], data[_size + 5], flag[_size + 5];
public:
block() {}
~block() {}
inline void build(int n)
{
len = sqrt(n);
for (register int i = 1; i <= n; ++i)
{
id[i] = (i - 1) / len + 1;
}
}
inline void modify(int L, int R, T v)
{
int l = id[L], r = id[R];
for (register int i = L; id[i] == l && i <= R; ++i)
{
data[i] += v;
sum[l] += v;
}
if (l == r)
{
return;
}
for (register int i = l + 1; i < r; ++i)
{
flag[i] += v;
sum[i] += len * v;
}
for (register int i = R; id[i] == r; --i)
{
data[i] += v;
sum[r] += v;
}
}
inline T query(int pos)
{
return data[pos] + flag[id[pos]];
}
};
int n, m, x, y, opt;
block<int, 10000000> b;
int main()
{
scanf("%d%d", &n, &m);
b.build(n);
while (m--)
{
scanf("%d%d", &opt, &x);
if (opt == 0)
{
scanf("%d", &y);
b.modify(x, y, 1);
}
else
{
printf("%d\n", b.query(x));
}
}
return 0;
}