#include <cstdio>
#include <set>
#include <map>
#include <vector>
#include <algorithm>
#include <utility>
#include <cmath>
#include <functional>
struct query{
int l,r,n;
long long int ans;
query(int l=0, int r=0, int n=0) : l(l), r(r), n(n) {ans=0LL;}
};
std::multiset<long long int, std::greater<long long int> > s;
std::vector<query> vq;
const int MAX_N=100000;
int x[MAX_N+1];
int n,q;
int root[MAX_N+1];
long long int cnt[MAX_N+1];
void setRoot()
{
std::map<int, int> m;
for(int i=1;i<=n;i++)
{
if(m[x[i]]==0)
{
root[i]=i;
m[x[i]]=i;
}
else root[i]=m[x[i]];
}
}
void calc()
{
int sq=(int)(ceil(sqrt(n+1)));
std::sort(vq.begin(), vq.end(), [&] (query A, query B) {
return A.l/sq == B.l/sq ? A.r < B.r : A.l < B.l;
});
int l=1;
int r=0;
for(int i=0;i<n;i++) s.insert(0);
for(int i=0;i<q;i++)
{
while(r<vq[i].r)
{
r++;
long long int prev = cnt[root[r]] * x[r];
auto it = s.find(prev);
s.erase(it);
cnt[root[r]]++;
s.insert(prev+x[r]);
}
while(r>vq[i].r)
{
long long int prev = cnt[root[r]] * x[r];
auto it = s.find(prev);
s.erase(it);
cnt[root[r]]--;
s.insert(prev-x[r]);
r--;
}
while(l<vq[i].l)
{
long long int prev = cnt[root[l]] * x[l];
auto it = s.find(prev);
s.erase(it);
cnt[root[l]]--;
s.insert(prev-x[l]);
l++;
}
while(l>vq[i].l)
{
l--;
long long int prev = cnt[root[l]] * x[l];
auto it = s.find(prev);
s.erase(it);
cnt[root[l]]++;
s.insert(prev+x[l]);
}
vq[i].ans=*s.begin();
}
std::sort(vq.begin(), vq.end(), [&] (query A, query B) {
return A.n < B.n;
});
for(int i=0;i<q;i++) printf("%lld\n", vq[i].ans);
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&x[i]);
}
for(int i=0;i<q;i++)
{
static int l,r;
scanf("%d%d",&l,&r);
vq.push_back(query(l,r,i));
}
setRoot();
calc();
}
Compilation message
historic.c:1:18: fatal error: cstdio: No such file or directory
#include <cstdio>
^
compilation terminated.