样例过不了,但感觉没啥问题?
部分代码:
const int MAXN = 5e5;
int n, m, l, r;
int a[MAXN + 5];
int rt[MAXN + 5];
struct Segment_Tree{
int tot;
int sum[32 * MAXN + 5];
int lc[32 * MAXN + 5], rc[32 * MAXN + 5];
void Initialize(int n)
{
for(int u = 0; u <= 32 * n; u ++) sum[u] = 0, lc[u] = rc[u] = 0;
}
void Change(int pu, int &u, int l, int r, int P)
{
u = ++ tot;
sum[u] = sum[pu] + 1, lc[u] = lc[pu], rc[u] = rc[pu];
if(l == r) return;
int mid = (l + r) >> 1;
if(P <= mid) Change(lc[pu], lc[u], l, mid, P);
else Change(rc[pu], rc[u], mid + 1, r, P);
}
int Query(int u, int v, int l, int r, int L)
{
if(l == r) return l;
int mid = (l + r) >> 1;
if(sum[lc[u]] - sum[lc[v]] >= L) return Query(lc[u], lc[v], l, mid, L);
if(sum[rc[u]] - sum[rc[v]] >= L) return Query(rc[u], rc[v], mid + 1, r, L);
return 0;
}
}tree;
void solve()
{
n = read(), m = read();
tree.Initialize(n);
for(int i = 1; i <= n; i ++){
a[i] = read();
tree.Change(rt[i - 1], rt[i], 1, n, a[i]);
}
while(m --){
l = read(), r = read();
write(tree.Query(rt[r], rt[l - 1], 1, n, (r - l + 1) / 2)), putchar('\n');
}
}