#include <bits/stdc++.h>   using namespace std;   uint64_t rnd_data = 0xDEADBEEFDULL;   inline void my_srand(int seed) { rnd_data = ((uint64_t)seed << 16) | 0x330E; }   inline int my_rand() {     rnd_data = rnd_data * 0x5DEECE66DULL + 0xB;     return (rnd_data >> 17) & 0x7FFFFFFF;   }   template <typename T>   void my_random_shuffle(T b, T e) {     for (int i = (1); i <= (int)((int)(e - b) - 1); i++) {       swap(b[i], b[my_rand() % (i + 1)]);     }   }   template <class _T>   inline _T sqr(const _T &x) {     return x * x;   }   template <typename type_t, typename less_t = std::less<type_t>>   inline bool uin(type_t &a, const type_t &b, const less_t &ls = less_t()) {     return ls(b, a) ? a = b, true : false;   }   template <typename type_t, typename less_t = std::less<type_t>>   inline bool uax(type_t &a, const type_t &b, const less_t &ls = less_t()) {     return ls(a, b) ? a = b, true : false;   }   const long double PI = 3.1415926535897932384626433832795L;   const long double EPS = 1e-9;   const int MAXN = 202400;   const size_t LIM = 300;   int n;   long double p[MAXN];   vector<int> a[MAXN];   vector<int> al[MAXN];   vector<int> ah[MAXN];   long double s[MAXN];   long double sh[MAXN];   bool hv[MAXN];   void precalc() {     for (int i = 0; i < (int)(n); i++) {       s[i] = 0.0;       for (int vn : al[i]) {         s[i] += p[vn];       }     }   }   int main() {     scanf( %d , &n);     for (int i = 0; i < (int)(n); i++) {       double x;       scanf( %lf , &x);       p[i] = x;     }     for (int i = 0; i < (int)(n - 1); i++) {       int x, y;       scanf( %d%d , &x, &y);       a[x].push_back(y);       a[y].push_back(x);     }     for (int i = 0; i < (int)(n); i++) {       hv[i] = a[i].size() > LIM;       sh[i] = 0.0;     }     for (int i = 0; i < (int)(n); i++) {       for (int vn : a[i]) {         if (hv[vn]) {           ah[i].push_back(vn);         } else {           al[i].push_back(vn);         }       }     }     precalc();     for (int i = 0; i < (int)(n); i++) {       if (hv[i]) {         for (auto vn : a[i]) {           sh[i] += 1.0 - p[vn];         }       }     }     int m;     scanf( %d , &m);     long double spall = 0.0;     for (int i = 0; i < (int)(n); i++) {       spall += p[i];     }     long double sumprev = 0.0;     for (int j = 0; j < (int)(n); j++) {       sumprev += a[j].size() * p[j];       sumprev += (1.0 - p[j]) * s[j];       sumprev += p[j] * sh[j];     }     for (int i = 0; i < (int)(m); i++) {       int x;       double y;       scanf( %d%lf , &x, &y);       spall -= p[x];       sumprev -= a[x].size() * p[x] + (1.0 - p[x]) * s[x] + p[x] * sh[x];       if (!hv[x]) {         for (int vn : a[x]) {           sumprev -= (1.0 - p[vn]) * s[vn];           s[vn] -= p[x];         }       }       for (auto vn : ah[x]) {         sumprev -= p[vn] * sh[vn];         sh[vn] -= 1.0 - p[x];       }       p[x] = y;       for (auto vn : ah[x]) {         sh[vn] += 1.0 - p[x];         sumprev += p[vn] * sh[vn];       }       if (!hv[x]) {         for (int vn : a[x]) {           s[vn] += p[x];           sumprev += (1.0 - p[vn]) * s[vn];         }       }       spall += p[x];       sumprev += a[x].size() * p[x] + (1.0 - p[x]) * s[x] + p[x] * sh[x];       long double ans = 2.0 + sumprev;       ans -= spall * 2.0;       ans /= 2.0;       printf( %0.9f n , (double)ans);     }     return 0;   }