#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
const char lf = '\n';
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0;
  int b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int _ = 200007;
const long double dinf = 1e99, eps = 1e-11;
inline int dcmp(long double x) {
  if (-eps < x && x < eps) return 0;
  return x > 0 ? 1 : -1;
}
int n, hav, qn, val[_] = {0}, cur[_] = {0}, lim[_] = {0};
long double nowcal(int x) {
  return (long double)val[x] * min(lim[x], cur[x]) /
         (min(lim[x], cur[x]) + lim[x]);
}
long double cal(int x, int d) {
  if (d < 0) return dinf;
  if (d >= lim[x]) return 0;
  return (long double)val[x] * lim[x] / (lim[x] + d) / (lim[x] + d + 1);
}
struct cxk {
  int x, d;
  long double v;
  cxk(int x_ = 0, int d_ = -1) { x = x_, d = d_, v = cal(x, d); }
  friend bool operator<(cxk a, cxk b) {
    if (dcmp(a.v - b.v) == 0) return a.x < b.x;
    return a.v < b.v;
  }
};
multiset<cxk> now, nex;
long double ans = 0;
void append() {
  auto x = --nex.end();
  ans += x->v;
  int a = x->x;
  now.erase(cxk(a, cur[a] - 1)), now.emplace(*x);
  cur[a]++, nex.erase(x), nex.emplace(cxk(a, cur[a]));
}
void remove() {
  auto x = now.begin();
  ans -= x->v;
  int a = x->x;
  nex.erase(cxk(a, cur[a])), nex.emplace(*x);
  cur[a]--, now.erase(*x), now.emplace(cxk(a, cur[a] - 1));
}
int main() {
  ios::sync_with_stdio(0), cout.tie(nullptr);
  n = ty(), hav = ty(), qn = ty();
  for (int i = 1; i <= n; i++) val[i] = ty();
  for (int i = 1; i <= n; i++) lim[i] = ty();
  for (int i = 1; i <= n; i++)
    cur[i] = 0, now.emplace(i, cur[i] - 1), nex.emplace(i, cur[i]);
  for (int i = 1; i <= hav; i++) append();
  for (int qq = 1; qq <= qn; qq++) {
    int op = ty() == 1 ? 1 : -1, x = ty();
    ans -= nowcal(x), now.erase(cxk(x, cur[x] - 1)), nex.erase(cxk(x, cur[x]));
    lim[x] += op;
    ans += nowcal(x), now.emplace(x, cur[x] - 1), nex.emplace(x, cur[x]);
    while (dcmp((nex.rbegin()->v) - (now.begin()->v)) > 0) remove(), append();
    cout << setprecision(11) << fixed << ans << lf;
  }
  return 0;
}
