为什么会超时!!!
code:
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1e5 + 10, M = N;
int n, m, res = 0;
int a[N], pos[N], ans[M];
struct Q
{
int l, r, id;
bool operator <(const Q &t)const
{
return pos[l] == pos[t.l] ? r < t.r : pos[l] == pos[t.l];;
}
}q[M];
inline void Add(register int x)
{
res += a[x];
}
inline void Sub(register int x)
{
res -= a[x];
}
template<typename T> inline void read(register T &qwq)
{
register T x = 0, f = 1;
register char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')
f = -1;
ch = getchar();
}
while (isdigit(ch))
x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
qwq = x * f;
return;
}
template<typename T> inline void write(register T x)
{
if (x < 0)
putchar('-'), x = -x;
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
return;
}
int main()
{
read(n);
register int sz = sqrt(n);
for (register int i = 1; i <= n; i ++ )
read(a[i]), pos[i] = i / sz;
read(m);
for (register int i = 1; i <= m; i ++ )
read(q[i].l), read(q[i].r), q[i].id = i;
register int l = 1, r = 0;
for (register int i = 1; i <= m; i ++ )
{
while (l > q[i].l) Add( -- l);
while (r < q[i].r) Add( ++ r);
while (l < q[i].l) Sub(l ++ );
while (r > q[i].r) Sub(r -- );
ans[q[i].id] = res;
}
for (register int i = 1; i <= m; i ++ )
write(ans[i]), puts("");
return 0;
}
提交记录