Rt.
看不懂编译错误 38 36 C:\Users\admin\Documents\未命名1.cpp [Error] no matching function for call to 'sort(std::pair<int, int>*, std::pair<int, int>*, <unresolved overloaded function type>)'
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <utility>
#include <algorithm>
using namespace std;
template <const int _size> class block
{
protected:
bool flag[_size + 5];
int n, len, End, id[_size + 5], cnt[_size + 5], box[_size + 5], diff[_size + 5], data[_size + 5], sum[(int)sqrt(_size) + 5][(int)sqrt(_size) + 5], minn[(int)sqrt(_size) + 5][(int)sqrt(_size) + 5];
pair<int, int> t, temp[_size + 5], mode[(int)sqrt(_size) + 5][(int)sqrt(_size) + 5];
inline bool cmp(pair<int, int> x, pair<int, int> y)
{
return x.second < y.second;
}
public:
block() {}
~block() {}
inline void build(int N, int a[])
{
n = N;
len = sqrt(n);
for (register int i = 1; i <= n; ++i)
{
id[i] = (i - 1) / len + 1;
temp[i] = make_pair(a[i], i);
}
sort(temp + 1, temp + n + 1);
diff[0] = -1;
for (register int i = 1; i <= n; ++i)
{
diff[i] = diff[i - 1] + (temp[i].first != temp[i - 1].first);
box[diff[i]] = temp[i].first;
}
sort(temp + 1, temp + n + 1, cmp);
for (register int i = 1; i <= End; ++i)
{
memset(cnt, 0, sizeof(cnt));
t = make_pair(0, 0);
for (register int j = i; j <= End; ++j)
{
for (register int k = (j - 1) * len + 1; k <= n && k <= j * len; ++k)
{
++cnt[diff[k]];
if (cnt[diff[k]] > t.first)
{
t = make_pair(cnt[diff[k]], diff[k]);
}
else if (cnt[diff[k]] == t.first)
{
t = make_pair(cnt[diff[k]], min(diff[k], t.second));
}
}
mode[i][j] = t;
}
}
for (register int i = 1; i <= End; ++i)
{
for (register int j = 1; j <= n; ++j)
{
sum[i][diff[j]] = sum[i - 1][diff[j]];
}
for (register int j = (i - 1) * len + 1; j <= n && j <= i * len; ++j)
{
++sum[i][diff[j]];
}
}
memset(cnt, 0, sizeof(cnt));
}
inline int query(int l, int r)
{
int ans = 0, t1 = 0, t2;
int L = id[l], R = id[r];
if (R - L < 3)
{
for (register int i = l; i <= r; ++i)
{
cnt[diff[i]] = 1;
if (cnt[diff[i]] > cnt[ans] || cnt[diff[i]] == cnt[ans] && diff[i] < ans)
{
ans = diff[i];
}
}
}
else
{
ans = mode[L + 1][R - 1].second;
cnt[ans] = 0;
flag[ans] = false;
for (register int i = l; i <= n && i <= L * len; ++i)
{
cnt[diff[i]] = 1;
flag[diff[i]] = false;
}
for (register int i = (R - 1) * len + 1; i <= r; ++i)
{
cnt[diff[i]] = 1;
flag[diff[i]] = false;
}
for (register int i = l, j; i <= n && i <= L * len; ++i)
{
if (!flag[diff[i]])
{
flag[diff[i]] = true;
j = cnt[diff[i]] + sum[R - 1][diff[i]] - sum[L][diff[i]];
if (j > t1)
{
t1 = j;
t2 = diff[i];
}
else if (j == t1 && t2 < diff[i])
{
t2 = diff[i];
}
}
}
for (register int i = (R - 1) * len + 1, j; i <= r; ++i)
{
if (!flag[diff[i]])
{
flag[diff[i]] = true;
j = cnt[diff[i]] + sum[R - 1][diff[i]] - sum[L][diff[i]];
if (j > t1)
{
t1 = j;
t2 = diff[i];
}
else if (j == t1 && t2 < diff[i])
{
t2 = diff[i];
}
}
}
if (cnt[ans] + mode[L + 1][R - 1].first < t1 || cnt[ans] + mode[L + 1][R - 1].first == t1 && t2 < ans)
{
ans = t2;
}
}
return box[ans];
}
};
int n, m, l, r, last, a[40005];
block<40000> b;
int main()
{
scanf("%d%d", &n, &m);
for (register int i = 1; i <= n; ++i)
{
scanf("%d", a + i);
}
b.build(n, a);
while (m--)
{
scanf("%d%d", &l, &r);
l = (l + last - 1) % n + 1;
r = (r + last - 1) % n + 1;
if (l > r)
{
swap(l, r);
}
last = b.query(l, r);
printf("%d\n", last);
}
return 0;
}