#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 300005;
const int sqr = 3000;
const int pos1 = 150002;
const int maxq = 50005;
map<int,int> el;
ll a[maxn];
ll neq[maxn];
int val[maxn];
int L = 0,R = -1;
struct block
{
block(int _l,int _r,ll _sum,ll _wsum,ll _ans){l = _l,r = _r;sum = _sum;wsum = _wsum;ans = _ans;};
block(){};
int l,r;
ll sum;
ll wsum;
ll ans;
};
block mrg(block a,block b)
{
block ans;
ans.sum = a.sum + b.sum;
ans.wsum = a.wsum + b.wsum + b.sum * (a.r-a.l+1);
ans.ans = a.ans + b.ans + a.sum * (b.wsum + b.sum) + (a.sum * (a.r-a.l+1) - a.wsum) * b.sum;
ans.l = a.l;
ans.r = b.r;
return ans;
}
int get_pos(int tpos,int sz)
{
int d = (sz-tpos)/2;
return pos1 + (sz%2 == tpos%2 ? -d : d);
}
ll get(int l,int r)
{
int tl = pos1 + 1,tr = pos1;
int tnum = maxn;
deque<block> blocks;
for(auto [me,f]:el)
{
ll e = -me;
if(f == 0)
continue;
tnum -= f;
int lg = get_pos(tnum,maxn),rg = get_pos(tnum+1,maxn);
if(lg > rg)
{
swap(lg,rg);
}
if(lg != tl)
{
ll len = tl-lg;
blocks.push_front(block(lg,tl-1,e*len,e * len * (len + 1) / 2,len * e * (e + 1) / 2 + e*e*neq[len]));
}
if(rg != tr)
{
ll len = rg-tr;
blocks.push_back(block(tr+1,rg,e*len,e * len * (len + 1) / 2,len * e * (e + 1) / 2 + e*e*neq[len]));
}
tl = lg;
tr = rg;
}
block ans = blocks[0];
for(int j =1;j < blocks.size();++j)
{
ans = mrg(ans,blocks[j]);
}
return ans.ans;
}
void add(int x)
{
if(val[x])
el[-val[x]]--;
if(el[-val[x]] == 0)
el.erase(-val[x]);
val[x]++;
el[-val[x]]++;
}
void sub(int x)
{
el[-val[x]]--;
if(el[-val[x]] == 0)
el.erase(-val[x]);
val[x]--;
if(val[x])
el[-val[x]]++;
}
ll res[maxq];
struct query
{
query(int _l,int _r,int _i){l = _l;r = _r;i = _i;};
query(){};
int l,r,i;
bool operator < (const query & oth){return (l/sqr != oth.l/sqr ? l/sqr < oth.l/sqr : r < oth.r);};
};
vector<query> ev;
void go_ll()
{
L--;
add(a[L]);
}
void go_lr()
{
sub(a[L]);
L++;
}
void go_rr()
{
R++;
add(a[R]);
}
void go_rl()
{
sub(a[R]);
R--;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,q;
cin >> n >> q;
block sb = block(0,0,1,1,0);
neq[1] = sb.ans;
for(int j = 2;j < maxn;++j)
{
sb = mrg(sb,block(j-1,j-1,1,1,0));
neq[j] = sb.ans;
}
for(int i = 0;i < n;++i)
{
cin >> a[i];
}
for(int i = 0;i < q;++i)
{
int l,r;
cin >> l >> r;
l--;
r--;
ev.push_back(query(l,r,i));
}
sort(ev.begin(),ev.end());
for(int i = 0;i < ev.size();++i)
{
int tl = ev[i].l;
int tr = ev[i].r;
while(L > tl)
{
go_ll();
}
while(R < tr)
{
go_rr();
}
while(L < tl)
{
go_lr();
}
while(R > tr)
{
go_rl();
}
res[ev[i].i] = get(0,maxn-1);
}
for(int i= 0 ;i < q;++i)
{
cout << res[i] << "\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |