实在调不动了,不知道哪里错了。
代码:
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
multiset<pair<ll,ll> > s2;
multiset<pair<ll,ll> >::iterator it;
ll nn,n,d,q,a[100005],tp[100005],ans[100005],qt,cnt,b[100005],vr,root,tag[100005],son[100005][2],rnd[100005],sz[100005],cc,val[100005],now;
string ss;
vector<ll> vc;
struct node{
ll k,m,id;
}c[100005];
ll cmp(node x,node y){
return x.k<y.k;
}
ll nwnd(ll x){
++vr;
rnd[vr]=rand()*rand();
val[vr]=x;
sz[vr]=1;
return vr;
}
void psup(ll x){
sz[x]=sz[son[x][0]]+sz[son[x][1]]+1;
}
void psdown(ll x){
if(tag[x]){
if(son[x][0]){
tag[son[x][0]]+=tag[x];
val[son[x][0]]+=tag[x];
}
if(son[x][1]){
tag[son[x][1]]+=tag[x];
val[son[x][1]]+=tag[x];
}
tag[x]=0;
psup(x);
}
}
ll merge(ll x,ll y){
if(!x||!y){
return x+y;
}
if(rnd[x]<=rnd[y]){
psdown(x);
son[x][1]=merge(son[x][1],y);
psup(x);
return x;
}
else{
psdown(y);
son[y][0]=merge(x,son[y][0]);
psup(y);
return y;
}
}
void split(ll rt,ll &x,ll &y,ll k){
if(!rt){
x=y=0;
return ;
}
psdown(rt);
if(sz[son[rt][0]]+1<=k){
x=rt;
split(son[rt][1],son[rt][1],y,k-sz[son[rt][0]]-1);
}
else{
y=rt;
split(son[rt][0],x,son[rt][0],k);
}
psup(rt);
}
void split2(ll rt,ll &x,ll &y,ll k){
if(!rt){
x=y=0;
return ;
}
psdown(rt);
if(val[rt]<=k){
x=rt;
split2(son[rt][1],son[rt][1],y,k);
}
else{
y=rt;
split2(son[rt][0],x,son[rt][0],k);
}
psup(rt);
}
void modify(ll x,ll v){
ll y,z;
split(root,y,z,x);
// cout<<tree[root]<<"伯爵\n";
tag[y]+=v;
val[y]+=v;
// cout<<tree[root]<<"威廉伯爵\n";
root=merge(z,y);
}
ll kth(ll x){
ll y,z,ret,xx;
//cout<<x<<" "<<root<<" "<<tree[root]<<" "<<tag[root]<<" "<<tree[son[root][0]]<<" "<<tree[son[root][1]]<<" ("<<endl;
split(root,y,z,x);
xx=y;
while(son[xx][1]){
psdown(xx);
xx=son[xx][1];
}
ret=val[xx];
root=merge(y,z);
// cout<<x<<" "<<root<<" "<<tree[root]<<" "<<tag[root]<<" "<<tree[son[root][0]]<<" "<<tree[son[root][1]]<<" )"<<endl;
return ret;
}
ll sums(ll x){
ll y,z,ret;
split2(root,y,z,x);
ret=sz[y];
root=merge(y,z);
return ret;
}
ll nxt(ll x){
ll t=x/cnt,t2=x%cnt;
if(!t2){
return kth(cnt)+(d+cnt-1)*t;
}
return max(kth(cnt)+(d+cnt-1)*t,kth(t2)+(d+cnt-1)*(t+1));
}
ll nxtFi(ll x){
ll t=x/cnt,t2=x%cnt;
if(!t2){
return kth(t2+1)+(d+cnt-1)*t;
}
return min(kth(1)+(d+cnt-1)*(t+1),kth(t2+1)+(d+cnt-1)*t);
}
void ins(ll x){
ll y,z;
split2(root,y,z,x);
root=merge(y,merge(nwnd(x),z));
}
void ers(ll x){
ll y,z,r;
split(root,y,z,x-1);
split(z,z,r,1);
root=merge(y,r);
}
void upd(ll x){
if(!s2.empty()){
it=s2.lower_bound(make_pair(cc,0));
if(it!=s2.end()&&(*it).first<cc+x){
s2.erase(it);
vc.push_back(a[(*it).second]);
upd(((*it).first-cc));
ers(1);
cnt--;
qt++;
upd(x-((*it).first-cc));
return ;
}
}
ll t=x/cnt,t2=x%cnt;
//cout<<kth(now)<<"AKCTSC\n";
//cout<<x<<" "<<now<<" "<<(d+now)*t<<"AKIOI\n";
modify(cnt,(d+cnt-1)*t);
//cout<<tree[root]<<" "<<root;
// cout<<" "<<tree[root]<<"AKCTSC\n";
if(t2){
// cout<<x<<" "<<t2<<" "<<d+now<<"AKNOI\n";
modify(t2,d+cnt-1);
}
cc+=x;
}
int main(){
srand(time(0));
cin>>n>>d>>q;
for(ll i=1;i<=n;i++){
cin>>a[i];
}
cin>>ss;
for(ll i=1;i<=q;i++){
cin>>c[i].k>>c[i].m;
c[i].id=i;
}
sort(c+1,c+q+1,cmp);
cnt=1;now=1;
root=nwnd(a[1]);
cc=0;
if(ss[0]=='0'){
ll l=0,r=c[q].k-cc,mid;
while(l<r){
mid=(l+r)>>1;
if(nxtFi(mid)>=a[now+1]){
r=mid;
}
else{
l=mid+1;
}
}
if(nxtFi(l)>=a[now+1]){
s2.insert({l+cc,now});
}
}
for(ll i=1;i<=q;i++){
while(now<n&&cc<=c[i].k){
ll s=nxt(c[i].k-cc);
// cout<<i<<" Pre"<<endl;
// cout<<"-----------------------------------\n";
// for(int j=1;j<=cnt;j++){
// cout<<kth(j)<<" ";
// }
// cout<<endl;
// cout<<"-----------------------------------\n";
if(s>=a[now+1]){
ll l,r,mid,tmp;
l=0,r=c[i].k-cc;
while(l<r){
mid=(l+r)>>1;
if(nxt(mid)>=a[now+1]){
r=mid;
}
else{
l=mid+1;
}
}
upd(l-1);
while(now<n&&kth(1)+cnt+d-1>=a[now+1]){
now++;
cnt++;
ins(a[now]);
if(ss[now-1]=='0'){
l=0,r=c[q].k-cc;
while(l<r){
mid=(l+r)>>1;
if(nxtFi(mid)>=a[now]){
r=mid;
}
else{
l=mid+1;
}
}
//cout<<now<<" Stop At: "<<l+cc<<endl;
if(nxtFi(l)>=a[now]){
s2.insert({l+cc,now});
}
}
}
//cout<<i<<" tmpisnotfound"<<endl;
//cout<<"-----------------------------------\n";
// for(int j=1;j<=cnt;j++){
// cout<<kth(j)<<" ";
// }
//cout<<endl;
// cout<<"-----------------------------------\n";
upd(1);
//modify(1,4);
// cout<<i<<" tmp is:"<<tmp<<endl;
// cout<<"-----------------------------------\n";
// for(int j=1;j<=cnt;j++){
// cout<<kth(j)<<" ";
// }
// cout<<endl;
// cout<<"-----------------------------------\n";
}
else{
break;
}
}
// cout<<i<<" "<<now<<" "<<tree[root]<<" TESTER"<<endl;
upd(c[i].k-cc);
// cout<<i<<" "<<now<<" "<<tree[root]<<" TESTERCOPY"<<endl;
if(c[i].m<=qt){
ans[c[i].id]=vc[c[i].m-1];
// if(n>=15){
// tp[c[i].id]=1;
// }
}
else if(cnt<(c[i].m-qt)){
ans[c[i].id]=a[now+(c[i].m-qt)-cnt];
// if(n>=15){
// tp[c[i].id]=2;
// }
}
else{
ans[c[i].id]=kth(c[i].m-qt);
// if(n>=15){
// tp[c[i].id]=3;
// }
}
}
for(ll i=1;i<=q;i++){
cout<<ans[i];
//if(n>=15){
// cout<<" "<<tp[i];
// }
cout<<endl;
}
return 0;
}