显示代码纯文本
#include<cstdio>
#define ll long long
inline ll MIN(ll A,ll B){return A<B?A:B;}
ll n,m,g,r,T,cnt=1,s[1100000],t[1100000];
ll L,R,X,W;
struct node
{
ll l,r,min;
}o[5100000];
inline void add(int l,int r,int t)
{
if(l==r)
{
o[t].min=MIN(o[t].min,W);
return;
}
int mid=l+r>>1;
if(X<=mid)
{
if(!o[t].l)
o[t].l=++cnt;
add(l,mid,o[t].l);
}
else
{
if(!o[t].r)
o[t].r=++cnt;
add(mid+1,r,o[t].r);
}
o[t].min=MIN(o[o[t].l].min,o[o[t].r].min);
}
inline void find(int l,int r,int t)
{
if(L<=l&&r<=R)
{
X=MIN(X,o[t].min);
return;
}
int mid=l+r>>1;
if(mid>=L&&o[t].l)
find(l,mid,o[t].l);
if(mid<R&&o[t].r)
find(mid+1,r,o[t].r);
}
void init()
{
for(int i=0;i<5100000;++i)
o[i].min=0x7fffffffffffffff;
scanf("%lld%lld%lld",&n,&g,&r);
T=g+r;
for(int i=0;i<=n;++i)
scanf("%lld",&s[i]);
for(int i=1;i<=n;++i)
s[i]+=s[i-1];
for(int i=n;i>-1;--i)
{
W=i;
X=s[i]%T;
add(0,T,1);
if(i)
W=(T-s[i-1]%T)%T;
else
W=0;
X=1e9;
L=((g-W)%T+T)%T,R=((T-1-W)%T+T)%T;
if(L<=R)
find(0,T,1);
else
{
ll LL=L,RR=R;
L=0,R=RR;
find(0,T,1);
L=LL,R=T-1;
find(0,T,1);
}
if(X<1e9)
{
if(X!=n)
{
if(i)
t[i]=T-(s[X]-s[i-1])%T+s[X]-s[i-1]+t[X+1];
else
t[i]=T-s[X]%T+s[X]+t[X+1];
}
else
{
if(i)
t[i]=s[n]-s[i-1];
else
t[i]=s[n];
}
}
else
{
if(i)
t[i]=s[n]-s[i-1];
else
t[i]=s[n];
}
}
}
void solve()
{
scanf("%lld",&m);
ll ans,tip;
while(m--)
{
ans=0;
scanf("%lld",&tip);
W=tip%T;
X=1e9;
L=((g-W)%T+T)%T,R=((T-1-W)%T+T)%T;
if(L<=R)
find(0,T,1);
else
{
ll LL=L,RR=R;
L=0,R=RR;
find(0,T,1);
L=LL,R=T-1;
find(0,T,1);
}
if(X<1e9)
{
if(X!=n)
ans=tip+T-(tip+s[X])%T+s[X]+t[X+1];
else
ans=tip+s[n];
}
else
ans=tip+s[n];
printf("%lld\n",ans);
}
}
int main()
{
freopen("rgl.in","r",stdin);
freopen("rgl.out","w",stdout);
init();
solve();
}