n*sqrt(n)过不了100000?
#include <bits/stdc++.h>
#define int unsigned int
using namespace std;
inline int read() {
int s = 0, f = 1; char ch = getchar();
for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') f = -1;
for(; ch <= '9' && ch >= '0'; s = s * 10 + (ch ^ 48), ch = getchar());
return (f == 1) ? s : -s;
}
inline void write(long long n) {
if(n > 9) write(n / 10);
putchar(n % 10 | 48);
return ;
}
const int maxn = 1e5 + 114;
const int maxq = 1e5 + 514;
struct node{
int data, rank;
}x[maxn];
int n, m, len;
int a[maxn], fa[maxn];
int b(int i) {
return (i - 1) / len + 1;
}
bool cmp1(node aa, node bb) {
return aa.data < bb.data;
}
void init() {
n = read(); m = read(); len = sqrt(n);
for(register int i = 1; i <= n; ++i) {
x[i].data = read();
x[i].rank = i;
}
sort(x + 1, x + n + 1, cmp1);
return ;
}
int tot;
void LSH() {
int lst = -114514;
for(register int i = 1; i <= n + 1; ++i) {
if(x[i].data != lst) {
fa[tot] = lst;
tot++;
}
a[x[i].rank] = tot;
lst = x[i].data;
}
return ;
}
struct Q{
int l, r, id;
}qsn[maxq];
bool cmp2(Q aa, Q bb) {
return (b(aa.l) == b(bb.l)) ? aa.r < bb.r : b(aa.l) < b(bb.l);
}
void in_q_sort_q() {
for(register int i = 1; i <= m; ++i) {
qsn[i].l = read(), qsn[i].r = read();
qsn[i].id = i;
}
sort(qsn + 1, qsn + m + 1, cmp2);
return ;
}
int cnt[maxn];
long long ans[maxn];
void work() {
int blk = 0, l = 0, r = 0;
long long now = 0;
for(register int i = 1; i <= m; ++i) {
int L = qsn[i].l, R = qsn[i].r;
if(b(L) == b(R)) {
now = 0;
for(register int k = 1; k <= tot; ++k) cnt[k] = 0;
for(register int j = L; j <= R; ++j) {
cnt[a[j]]++;
if(cnt[a[j]])
now = max(now, 1ll * fa[a[j]] * cnt[a[j]]);
}
for(register int j = L; j <= R; ++j) {
memset(cnt, 0, sizeof(cnt));
}
ans[qsn[i].id] = now;
continue;
}
int p1 = b(L);
if(blk != p1) {
now = 0;
for(register int k = 1; k <= tot; ++k) cnt[k] = 0;
l = p1 * len; r = l - 1;
blk = p1;
}
while(r < R) {
r++;
cnt[a[r]]++;
if(cnt[a[r]])
now = max(now, 1ll * cnt[a[r]] * fa[a[r]]);
}
int p = l;
long long now1 = 0;
while(p > L) {
p--;
cnt[a[p]]++;
if(cnt[a[p]])
now1 = max(now1, 1ll * fa[a[p]] * cnt[a[p]]);
}
while(p < l) {
cnt[a[p]]--;
p++;
}
ans[qsn[i].id] = max(now, now1);
}
return ;
}
void print() {
for(register int i = 1; i <= m; ++i) {
write(ans[i]), putchar('\n');
}
return ;
}
signed main() {
init();
LSH();
in_q_sort_q();
work();
print();
return 0;
}
到底是算法的问题还是常数的问题呢?