求调代码,每个样例多测中大部分的输出答案都正确,仅有极个别输出不一致,但导致一共只通过2个测试点。
例如样例输出为:
yumi!
yumi!
28
24
28
yumi!
我的输出为:
yumi!
yumi!
28
26
28
yumi!
以下为代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ull unsigned long long
#define il inline
const int MAXN = 500010;
const int M = MAXN * 30;
ll n,q,m,tot;
int a[MAXN], t[MAXN];
int T[M], lson[M], rson[M], c[M];
void Init_hash(){
for(int i = 1; i <= n; i++) t[i] = a[i];
sort(t+1,t+1+n);
m = unique(t+1,t+1+n)-t-1;
}
int build(int l,int r){
int root = tot++;
c[root] = 0;
if(l != r){
int mid = (l+r)>>1;
lson[root] = build(l,mid);
rson[root] = build(mid+1,r);
}
return root;
}
int Hash(int x){
return lower_bound(t+1, t+1+m, x) - t;
}
int update(int root, int pos, int val){
int newroot = tot++, tmp = newroot;
c[newroot] = c[root] + val;
int l = 1, r = m;
while(l < r){
int mid = (l+r) >> 1;
if(pos <= mid){
lson[newroot] = tot++;
rson[newroot] = rson[root];
newroot = lson[newroot];
root = lson[root];
r = mid;
}
else{
rson[newroot] = tot++;
lson[newroot] = lson[root];
newroot = rson[newroot];
root = rson[root];
l = mid + 1;
}
c[newroot] = c[root] + val;
}
return tmp;
}
int query(int left_root, int right_root, int k){
int l = 1, r = m;
while(l < r){
int mid = (l+r) >> 1;
if(c[lson[left_root]]-c[lson[right_root]] >= k){
r = mid;
left_root = lson[left_root];
right_root = lson[right_root];
}
else{
l = mid + 1;
k -= c[lson[left_root]] - c[lson[right_root]];
left_root = rson[left_root];
right_root = rson[right_root];
}
}
return l;
}
void reading(int &ret){
ret=0;
char ch=getchar();
int flag=1;
while(ch>'9'||ch<'0'){if(ch=='-') flag=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){
ret=ret*10+ch-'0';
ch=getchar();
}
ret*=flag;
}
signed main(){
while(~scanf("%lld%lld", &n, &q)){
for (int i = 1; i <= n; i++) reading(a[i]);
tot=0;
Init_hash();
T[n + 1] = build(1, m);
for (int i = n; i; i--){
int pos = Hash(a[i]);
T[i] = update(T[i + 1], pos, 1);
}
while (q--) {
int l, r;
reading(l), reading(r);
int len = 1;
ll ans = -1;
while (len <= (r - l - 1)) {
ll x1 = t[query(T[l], T[r + 1], len)];
ll x2 = t[query(T[l], T[r + 1], len + 1)];
ll x3 = t[query(T[l], T[r + 1], len + 2)];
if (x3 < x2 + x1 && x3 > x2 - x1) {
ans = 1ll * x1 + 1ll * x2 + 1ll * x3;
break;
}
len++;
}
if(ans == -1) cout << "yumi!" << '\n';
else printf("%lld\n", ans);
}
}
return 0;
}