AT1219 歴史の研究
好加难删,那就不删,往前ban,往回滚
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <numeric>
#define R(a,b,c) for(register int a = (b); a <= (c); ++a)
#define nR(a,b,c) for(register int a = (b); a >= (c); --a)
#define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b))
#define MP make_pair
#ifdef QWQ
#define D_e_Line printf("\n------\n")
#define D_e(x) cerr << (#x) << " " << x << endl
#define C_e(x) cout << (#x) << " " << x << endl
#define FileOpen() freopen("in.txt", "r", stdin)
#define FileSave() freopen("out.txt", "w", stdout)
#define Pause() system("pause")
#include <cassert>
#define PASS fprintf(stderr, "Passing [%s] in LINE %d\n",__FUNCTION__,__LINE__)
#else
#define D_e_Line
#define D_e(x)
#define C_e(x)
#define FileOpen()
#define FileSave()
#define Pause()
#define PASS
#endif
using namespace std;
struct FastIO {
template<typename ATP> inline FastIO& operator >> (ATP &x) {
x = 0; int sign = 1; char c;
for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') sign = -1;
while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
if(sign == -1) x = -x;
return *this;
}
} io;
template<typename ATP> inline ATP Max(ATP x, ATP y) {
return x > y ? x : y;
}
template<typename ATP> inline ATP Min(ATP x, ATP y) {
return x < y ? x : y;
}
template<typename ATP> inline ATP Abs(ATP x) {
return x < 0 ? -x : x;
}
const int N = 1e5 + 7;
#define int long long
struct Ques {
int l, r, id;
} q[N];
int blo[N], bloSize, ans[N], a[N], b[N], tot[N], tmp[N], ANS, n;
inline void Add(int i) {
++tot[a[i]];
ANS = Max(ANS, tot[a[i]] * b[a[i]]);
}
inline void Del(int i) {
--tot[a[i]];
}
inline int Calc(int l, int r) {
int maxx = 0;
R(i,l,r) tmp[a[i]] = 0;
R(i,l,r) ++tmp[a[i]], maxx = Max(maxx, tmp[a[i]] * b[a[i]]);
return maxx;
}
int now = 1;
inline void Solve(int &id) {
int maxn = Min(n, bloSize * id), r = maxn;
memset(tot, 0, (n + 3) * sizeof(int));
ANS = 0;
for(; blo[q[now].l] == id; ++now){
if(blo[q[now].l] == blo[q[now].r]){
ans[q[now].id] = Calc(q[now].l, q[now].r);
continue;
}
while(r < q[now].r) Add(++r);
int lst = ANS;
R(i,q[now].l,maxn) Add(i);
ans[q[now].id] = ANS;
R(i,q[now].l,maxn) Del(i);
ANS = lst;
}
}
#undef int
int main() {
#define int long long
int m;
io >> n >> m;
R(i,1,n) io >> a[i], b[i] = a[i];
sort(b + 1, b + n + 1);
int tot = unique(b + 1, b + n + 1) - b - 1;
R(i,1,n) a[i] = lower_bound(b + 1, b + tot + 1, a[i]) - b;
bloSize = sqrt(n);
R(i,1,n) blo[i] = (i - 1) / bloSize + 1;
R(i,1,m){
io >> q[i].l >> q[i].r;
q[i].id = i;
}
sort(q + 1, q + m + 1, [&](const Ques &x, const Ques &y){
if(blo[x.l] != blo[y.l]) return blo[x.l] < blo[y.l];
return x.r < y.r;
});
R(i,1,blo[n]) Solve(i);
R(i,1,m) printf("%lld\n", ans[i]);
return 0;
}