传送门 位置记录:q[q[i].pos].poss=i;
using namespace std;
const ll maxn = 100000 + 5;
struct node {
ll name;
ll cost;
ll pos;
ll poss;
} q[maxn];
bool cmp(node x, node y) {
if(x.cost != y.cost)
return x.cost < y.cost;
return x.name < y.name;
}
int main() {
ios::sync_with_stdio(false);
ll n, m;
ll ans = 0, sum, cnt, na, nu;
cin >> n >> m;
for(ll i = 0; i < n; i++) {
cin >> q[i].name;
ans += q[i].name;
}
for(ll i=0;i<n;i++)
q[i].pos=i+1;
//q[i].poss;
ll t;
for(ll i = 0; i < n; i++)
cin >> q[i].cost;
sort(q, q + n, cmp);
for(int i=1;i<=n;i++)
{
//原来的坐标给t
q[q[i].pos].poss=i;//**记录原来的位置坐标,以便在排序之后找到所需要的盘菜。
}
cnt=0;
bool flag=1;/*这里有个点容易忽略 如果存在无法为一位顾客提供饭菜的情况,则顾客会很愤怒并带走所有的菜。*/
while(m--) {
cin >> na >> nu;
/*for(ll i=0;i<n;i++)
if(q[i].pos==na)
{na=i;
break;}*/
na=q[na].poss;
if(q[na].name >= nu) {
cout << flag*nu*q[na].cost << endl;
q[na].name -= nu;
ans-=nu;
} else {
if(ans < nu) {//无法满足顾客
cout << 0 << endl;
ans=0;
flag=0;
continue;
}
t = nu - q[na].name;
sum=q[na].name*q[na].cost;
ans -= nu;
q[na].name = 0;
//cnt = 0;
while(t)
{
while(q[cnt].name==0)
cnt++;
if(t<=q[cnt].name)
{sum+=q[cnt].cost*t;
q[cnt].name-=t;
break;}
else {
sum+=q[cnt].name*q[cnt].cost;
t-=q[cnt].name;
q[cnt].name=0;
}
}
/*while(t--) {
if(q[cnt].name == 0)
{
while(q[cnt].name==0)
cnt++;
}
sum += q[cnt].cost;
q[cnt].name--;
}*/
cout << sum << endl;
}
}
return 0;
}