有没有大佬看看,或者提供一下错误原因的可能性?实在是找不出了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 500010, maxv = 100010;
inline int read()
{
int x = 0; char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
return x;
}
int n, m;
int a[maxn], bl[maxn];
int len;
struct tr
{
int ss[maxn];
#define lowbit(x) (x & -x)
void add(int x, int k) {
while (x <= maxv)
ss[x] += k, x += lowbit(x);
}
inline int ask(int x)
{
int ans = 0;
for (; x; ans += ss[x], x -= lowbit(x));
return ans;
}
void clear() {
for (int i = 0; i <= maxv; ++i) ss[i]=0;
}
}T1, T2, T3;
struct ques
{
int ql, qr;
int id;
bool operator < (const ques &a) {
return (bl[ql] == bl[a.ql]) ? qr < a.qr : ql < a.ql;
}
}q[maxn];
int t[maxn], pref[maxn];
const int sq = sqrt(maxv);
int tot;
inline void init()
{
n = read(), m = read();
T3.clear();
for (int i = 1; i <= n; ++i) a[i] = read(), T3.add(i, a[i]);
for (int i = 1; i <= m; ++i)
q[i].ql = read(), q[i].qr = read(), q[i].id = i;
len = sqrt(n);
for (int i = 1; i <= n; ++i) bl[i] = i / len + 1;
sort(q + 1, q + 1 + m);
T1.clear();
T2.clear();
int sum = 0;
for (int i = 1; i <= n; ++i)
{
pref[i] = pref[i - 1] + (T1.ask(a[i] - 1)) * a[i] + sum - T2.ask(a[i]);
T1.add(a[i], 1);
T2.add(a[i], a[i]);
sum += a[i];
}
// for (int i = 2; i <= n; ++i) pref[i] -= pref[1];
// pref[1] = 0;
// for (int i = 1; i <= n; ++i) cout<<pref[i]<<" ";
// cout<<endl;
}
struct node
{
int l, r, opt;
int id;
node(int OPT, int L, int R, int ID) { opt = OPT, l = L, r = R, id = ID; }
};
int ans[maxn], rk[maxn];
vector<node> ch[maxn];
int ct[maxn], sol[maxn];
inline void solve()
{
int fr = 1, ed = 0;
for (int i = 1; i <= m; ++i)
{
int l = q[i].ql, r = q[i].qr, res = 0;
// cout<<"rk = "<<i<<" l = "<<l<<" r = "<<r<<endl;
rk[q[i].id] = i;
if (ed > r) res -= pref[ed] - pref[r], ++ct[fr - 1], ch[fr - 1].push_back(node( 1, r + 1, ed, q[i].id)), ed = r;
if (ed < r) res += pref[r] - pref[ed], ++ct[fr - 1], ch[fr - 1].push_back(node(-1, ed + 1, r, q[i].id)), ed = r;
if (fr > l) res -= pref[fr - 1] - pref[l - 1], ++ct[r], ch[r].push_back(node( 1, l, fr - 1, q[i].id)), fr = l;
if (fr < l) res += pref[l - 1] - pref[fr - 1], ++ct[r], ch[r].push_back(node(-1, fr, l - 1, q[i].id)), fr = l;
sol[i] = res;
}
// cout<<"after solve, sol:\n";
// for (int i = 1; i <= m; ++i)
// cout<<sol[i]<<" ";
// cout<<endl;
}
struct block
{
int blt[sq + 10], t[maxn], uid[maxn];
int L[maxn], R[maxn];
inline void initial()
{
for (int i = 1; i <= sq; ++i) blt[i] = 0;
for (int i = 1; i <= maxv; ++i)
uid[i] = i / sq + 1, t[i] = 0;
tot = maxv / sq + 1;
for (int i = 1; i < tot; ++i) L[i] = R[i - 1] + 1, R[i] = sq * i - 1;
L[tot] = R[tot - 1] + 1, R[tot] = maxv;
}
inline void ins1(int x, int y)
{
int cnt = tot + 1;
for (int i = tot; i >= 1; --i)
{
if (L[i] > x) blt[i] += y, cnt = i;
else break;
}
for (int i = R[cnt - 1]; i > x; --i) t[i] += y;
}
inline void ins2(int x, int y)
{
int cnt = 0;
for (int i = 1; i <= tot; ++i)
{
if (R[i] < x) blt[i] += y, cnt = i;
else break;
}
for (int i = L[cnt + 1]; i < x; ++i) t[i] += y;
}
inline int qry(int x) {
return blt[uid[x]] + t[x];
}
}b, c;
inline void work()
{
b.initial(), c.initial();
for (int i = 1; i <= n; ++i)
{
b.ins1(a[i], 1);
c.ins2(a[i], a[i]);
for (int j = 0; j < ct[i]; ++j)
{
node tmp = ch[i][j];
for (int w = tmp.l; w <= tmp.r; ++w)
{
int res = ( (b.qry(a[w])) * a[w] + c.qry(a[w]) );
sol[rk[tmp.id]] += tmp.opt * res;
// cout<<"res = "<<res<<endl;
// cout<<"w = "<<w<<" opt = "<<tmp.opt<<endl;
// cout<<"id = "<<rk[tmp.id]<<endl<<b.qry(a[w])<<endl;
}
}
}
}
inline void print()
{
int res = 0;
// cout<<"final, sol:\n";
// for (int i = 1; i <= m; ++i)
// cout<<sol[i]<<" ";
// cout<<endl;
for (int i = 1; i <= m; ++i)
{
res += sol[i];
ans[q[i].id] = res + T3.ask(q[i].qr) - T3.ask(q[i].ql - 1);
}
for (int i = 1; i <= m; ++i)
cout<<ans[i]<<endl;
}
signed main()
{
freopen("wish2.in", "r", stdin);
init();
solve();
work();
print();
return 0;
}
/*
21
5
51
49
11
7
2
5 2
1 2 4 3 5
1 3
2 3
*/