#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll MOD = 1e9 + 7;
ll addd(ll a, ll b) { return ((a % MOD) + (b % MOD)) % MOD; }
ll mul(ll a, ll b) { return ((a % MOD) * (b % MOD)) % MOD; }
ll sub(ll a, ll b) { return (((a - b) % MOD) + MOD) % MOD; }
ll modExp(ll a, ll b) {
if (b <= 0)
return 1;
ll ret = modExp(a * a % MOD, b / 2);
if (b % 2)
ret = ret * a % MOD;
return ret;
}
ll inverse(ll b) { return modExp(b, MOD - 2); }
ll divv(ll a, ll b) { return ((a % MOD) * (inverse(b) % MOD)) % MOD; }
//prod st
#define int long long
struct SegmentTreeP { // 0-Indexed
vector<int> tree;
int skip = 1; // depentent on merge (sum => 0, min => OO, max => -OO)
int sz;
#define mid ((r + l) >> 1)
#define L node * 2 + 1
#define R node * 2 + 2
int merge(int a, int b){
return mul(a,b);
}
int build(int l, int r, int node, vector<int> &a){
if(l == r){
if(l < (int)a.size()) return (tree[node] = a[l]);
return skip;
}
return tree[node] = merge(build(l, mid, L, a), build(mid + 1, r, R, a));
}
int update(int l, int r, int node, int idx, int val){
if(l == r) return tree[node] = val;
if(idx <= mid) return tree[node] = merge(update(l, mid, L, idx, val), tree[R]);
else return tree[node] = merge(tree[L], update(mid + 1, r, R, idx, val));
}
int add(int l, int r, int node, int idx, int val){
if(l == r) return tree[node] += val;
if(idx <= mid) return tree[node] = merge(add(l, mid, L, idx, val), tree[R]);
else return tree[node] = merge(tree[L], add(mid + 1, r, R, idx, val));
}
int query(int l, int r, int node, int tl, int tr){
if(tl > r || tr < l) return skip;
if(l >= tl && r <= tr) return tree[node];
return merge(query(l, mid, L, tl, tr), query(mid + 1, r, R, tl, tr));
}
SegmentTreeP(vector <int> &a){
int n = (int)a.size(); sz = 1;
while(sz <= n) sz *= 2;
tree = vector <int> (2 * sz, skip);
build(0, sz - 1, 0, a);
}
SegmentTreeP(int n){
sz = 1;
while(sz <= n) sz *= 2;
tree = vector <int> (2 * sz, skip);
}
void update(int idx, int val){ update(0, sz - 1, 0, idx, val); }
void add(int idx, int val){ add(0, sz - 1, 0, idx, val); }
int query(int l, int r){ return query(0, sz - 1, 0, l, r); }
#undef R
#undef L
#undef mid
};
#undef int
//sum st
#define int long long
struct SegmentTreeS { // 0-Indexed
vector<int> tree;
int skip = 0; // depentent on merge (sum => 0, min => OO, max => -OO)
int sz;
#define mid ((r + l) >> 1)
#define L node * 2 + 1
#define R node * 2 + 2
int merge(int a, int b){
return addd(a,b);
}
int build(int l, int r, int node, vector<int> &a){
if(l == r){
if(l < (int)a.size()) return (tree[node] = a[l]);
return skip;
}
return tree[node] = merge(build(l, mid, L, a), build(mid + 1, r, R, a));
}
int update(int l, int r, int node, int idx, int val){
if(l == r) return tree[node] = val;
if(idx <= mid) return tree[node] = merge(update(l, mid, L, idx, val), tree[R]);
else return tree[node] = merge(tree[L], update(mid + 1, r, R, idx, val));
}
int add(int l, int r, int node, int idx, int val){
if(l == r) return tree[node] += val;
if(idx <= mid) return tree[node] = merge(add(l, mid, L, idx, val), tree[R]);
else return tree[node] = merge(tree[L], add(mid + 1, r, R, idx, val));
}
int query(int l, int r, int node, int tl, int tr){
if(tl > r || tr < l) return skip;
if(l >= tl && r <= tr) return tree[node];
return merge(query(l, mid, L, tl, tr), query(mid + 1, r, R, tl, tr));
}
SegmentTreeS(vector <int> &a){
int n = (int)a.size(); sz = 1;
while(sz <= n) sz *= 2;
tree = vector <int> (2 * sz, skip);
build(0, sz - 1, 0, a);
}
SegmentTreeS(int n){
sz = 1;
while(sz <= n) sz *= 2;
tree = vector <int> (2 * sz, skip);
}
void update(int idx, int val){ update(0, sz - 1, 0, idx, val); }
void add(int idx, int val){ add(0, sz - 1, 0, idx, val); }
int query(int l, int r){ return query(0, sz - 1, 0, l, r); }
#undef R
#undef L
#undef mid
};
#undef int
ll power(ll b,ll n)
{
b%=MOD;
ll s=1;
while(n)
{
if(n%2==1)s=s*b%MOD;
b=b*b%MOD;
n/=2;
}
return s;
}
void solve() {
ll n;
cin >> n;
vector<ll> v(n);
ll q;
cin >> q;
vector<ll> summ(n);
for (ll i = 0; i < n; i++){
cin >> v[i];
summ[i]=divv(divv(v[i],100),divv(100-v[i],100));
v[i]=divv(100-v[i],100);
}
SegmentTreeP sp(v);
SegmentTreeS ss(summ);
while (q--) {
ll t;
cin >> t;
if (t == 1) {
ll ind,val;
cin >> ind>>val;
sp.update(ind-1,divv(100-val,100));
ss.update(ind-1,divv(divv(val,100),divv(100-val,100)));
}
else{
ll ind;
cin >> ind;
//product + product*sum
ll f=sp.query(ind,n-1);
ll s=ss.query(ind,n-1);
cout << addd(f,(mul(f,s)))<<endl;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsbCBNT0QgPSAxZTkgKyA3OwpsbCBhZGRkKGxsIGEsIGxsIGIpIHsgcmV0dXJuICgoYSAlIE1PRCkgKyAoYiAlIE1PRCkpICUgTU9EOyB9CmxsIG11bChsbCBhLCBsbCBiKSB7IHJldHVybiAoKGEgJSBNT0QpICogKGIgJSBNT0QpKSAlIE1PRDsgfQpsbCBzdWIobGwgYSwgbGwgYikgeyByZXR1cm4gKCgoYSAtIGIpICUgTU9EKSArIE1PRCkgJSBNT0Q7IH0KbGwgbW9kRXhwKGxsIGEsIGxsIGIpIHsKICBpZiAoYiA8PSAwKQogICAgcmV0dXJuIDE7CiAgbGwgcmV0ID0gbW9kRXhwKGEgKiBhICUgTU9ELCBiIC8gMik7CiAgaWYgKGIgJSAyKQogICAgcmV0ID0gcmV0ICogYSAlIE1PRDsKICByZXR1cm4gcmV0Owp9CmxsIGludmVyc2UobGwgYikgeyByZXR1cm4gbW9kRXhwKGIsIE1PRCAtIDIpOyB9CmxsIGRpdnYobGwgYSwgbGwgYikgeyByZXR1cm4gKChhICUgTU9EKSAqIChpbnZlcnNlKGIpICUgTU9EKSkgJSBNT0Q7IH0KCgovL3Byb2Qgc3QKCgojZGVmaW5lIGludCBsb25nIGxvbmcKc3RydWN0IFNlZ21lbnRUcmVlUCB7IC8vIDAtSW5kZXhlZAogICAgdmVjdG9yPGludD4gdHJlZTsKICAgIGludCBza2lwID0gMTsgLy8gZGVwZW50ZW50IG9uIG1lcmdlIChzdW0gPT4gMCwgbWluID0+IE9PLCBtYXggPT4gLU9PKQogICAgaW50IHN6OwoKI2RlZmluZSBtaWQgKChyICsgbCkgPj4gMSkKI2RlZmluZSBMIG5vZGUgKiAyICsgMQojZGVmaW5lIFIgbm9kZSAqIDIgKyAyCgogICAgaW50IG1lcmdlKGludCBhLCBpbnQgYil7CiAgICAgICAgcmV0dXJuIG11bChhLGIpOwogICAgfQoKICAgIGludCBidWlsZChpbnQgbCwgaW50IHIsIGludCBub2RlLCB2ZWN0b3I8aW50PiAmYSl7CiAgICAgICAgaWYobCA9PSByKXsKICAgICAgICAgICAgaWYobCA8IChpbnQpYS5zaXplKCkpIHJldHVybiAodHJlZVtub2RlXSA9IGFbbF0pOwogICAgICAgICAgICByZXR1cm4gc2tpcDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRyZWVbbm9kZV0gPSBtZXJnZShidWlsZChsLCBtaWQsIEwsIGEpLCBidWlsZChtaWQgKyAxLCByLCBSLCBhKSk7CiAgICB9CgogICAgaW50IHVwZGF0ZShpbnQgbCwgaW50IHIsIGludCBub2RlLCBpbnQgaWR4LCBpbnQgdmFsKXsKICAgICAgICBpZihsID09IHIpIHJldHVybiB0cmVlW25vZGVdID0gdmFsOwogICAgICAgIGlmKGlkeCA8PSBtaWQpIHJldHVybiB0cmVlW25vZGVdID0gbWVyZ2UodXBkYXRlKGwsIG1pZCwgTCwgaWR4LCB2YWwpLCB0cmVlW1JdKTsKICAgICAgICBlbHNlIHJldHVybiB0cmVlW25vZGVdID0gbWVyZ2UodHJlZVtMXSwgdXBkYXRlKG1pZCArIDEsIHIsIFIsIGlkeCwgdmFsKSk7CiAgICB9CiAgICBpbnQgYWRkKGludCBsLCBpbnQgciwgaW50IG5vZGUsIGludCBpZHgsIGludCB2YWwpewogICAgICAgIGlmKGwgPT0gcikgcmV0dXJuIHRyZWVbbm9kZV0gKz0gdmFsOwogICAgICAgIGlmKGlkeCA8PSBtaWQpIHJldHVybiB0cmVlW25vZGVdID0gbWVyZ2UoYWRkKGwsIG1pZCwgTCwgaWR4LCB2YWwpLCB0cmVlW1JdKTsKICAgICAgICBlbHNlIHJldHVybiB0cmVlW25vZGVdID0gbWVyZ2UodHJlZVtMXSwgYWRkKG1pZCArIDEsIHIsIFIsIGlkeCwgdmFsKSk7CiAgICB9CgogICAgaW50IHF1ZXJ5KGludCBsLCBpbnQgciwgaW50IG5vZGUsIGludCB0bCwgaW50IHRyKXsKICAgICAgICBpZih0bCA+IHIgfHwgdHIgPCBsKSByZXR1cm4gc2tpcDsKICAgICAgICBpZihsID49IHRsICYmIHIgPD0gdHIpIHJldHVybiB0cmVlW25vZGVdOwogICAgICAgIHJldHVybiBtZXJnZShxdWVyeShsLCBtaWQsIEwsIHRsLCB0ciksIHF1ZXJ5KG1pZCArIDEsIHIsIFIsIHRsLCB0cikpOwogICAgfQoKICAgIFNlZ21lbnRUcmVlUCh2ZWN0b3IgPGludD4gJmEpewogICAgICAgIGludCBuID0gKGludClhLnNpemUoKTsgc3ogPSAxOwogICAgICAgIHdoaWxlKHN6IDw9IG4pIHN6ICo9IDI7CiAgICAgICAgdHJlZSA9IHZlY3RvciA8aW50PiAoMiAqIHN6LCBza2lwKTsKICAgICAgICBidWlsZCgwLCBzeiAtIDEsIDAsIGEpOwogICAgfQoKICAgIFNlZ21lbnRUcmVlUChpbnQgbil7CiAgICAgICAgc3ogPSAxOwogICAgICAgIHdoaWxlKHN6IDw9IG4pIHN6ICo9IDI7CiAgICAgICAgdHJlZSA9IHZlY3RvciA8aW50PiAoMiAqIHN6LCBza2lwKTsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZShpbnQgaWR4LCBpbnQgdmFsKXsgdXBkYXRlKDAsIHN6IC0gMSwgMCwgaWR4LCB2YWwpOyB9CiAgICB2b2lkIGFkZChpbnQgaWR4LCBpbnQgdmFsKXsgYWRkKDAsIHN6IC0gMSwgMCwgaWR4LCB2YWwpOyB9CiAgICBpbnQgcXVlcnkoaW50IGwsIGludCByKXsgIHJldHVybiBxdWVyeSgwLCBzeiAtIDEsIDAsIGwsIHIpOyB9CgojdW5kZWYgUgojdW5kZWYgTAojdW5kZWYgbWlkCn07CiN1bmRlZiBpbnQKCgovL3N1bSBzdAoKI2RlZmluZSBpbnQgbG9uZyBsb25nCnN0cnVjdCBTZWdtZW50VHJlZVMgeyAvLyAwLUluZGV4ZWQKICAgIHZlY3RvcjxpbnQ+IHRyZWU7CiAgICBpbnQgc2tpcCA9IDA7IC8vIGRlcGVudGVudCBvbiBtZXJnZSAoc3VtID0+IDAsIG1pbiA9PiBPTywgbWF4ID0+IC1PTykKICAgIGludCBzejsKCiNkZWZpbmUgbWlkICgociArIGwpID4+IDEpCiNkZWZpbmUgTCBub2RlICogMiArIDEKI2RlZmluZSBSIG5vZGUgKiAyICsgMgoKICAgIGludCBtZXJnZShpbnQgYSwgaW50IGIpewogICAgICAgIHJldHVybiBhZGRkKGEsYik7CiAgICB9CgogICAgaW50IGJ1aWxkKGludCBsLCBpbnQgciwgaW50IG5vZGUsIHZlY3RvcjxpbnQ+ICZhKXsKICAgICAgICBpZihsID09IHIpewogICAgICAgICAgICBpZihsIDwgKGludClhLnNpemUoKSkgcmV0dXJuICh0cmVlW25vZGVdID0gYVtsXSk7CiAgICAgICAgICAgIHJldHVybiBza2lwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJlZVtub2RlXSA9IG1lcmdlKGJ1aWxkKGwsIG1pZCwgTCwgYSksIGJ1aWxkKG1pZCArIDEsIHIsIFIsIGEpKTsKICAgIH0KCiAgICBpbnQgdXBkYXRlKGludCBsLCBpbnQgciwgaW50IG5vZGUsIGludCBpZHgsIGludCB2YWwpewogICAgICAgIGlmKGwgPT0gcikgcmV0dXJuIHRyZWVbbm9kZV0gPSB2YWw7CiAgICAgICAgaWYoaWR4IDw9IG1pZCkgcmV0dXJuIHRyZWVbbm9kZV0gPSBtZXJnZSh1cGRhdGUobCwgbWlkLCBMLCBpZHgsIHZhbCksIHRyZWVbUl0pOwogICAgICAgIGVsc2UgcmV0dXJuIHRyZWVbbm9kZV0gPSBtZXJnZSh0cmVlW0xdLCB1cGRhdGUobWlkICsgMSwgciwgUiwgaWR4LCB2YWwpKTsKICAgIH0KICAgIGludCBhZGQoaW50IGwsIGludCByLCBpbnQgbm9kZSwgaW50IGlkeCwgaW50IHZhbCl7CiAgICAgICAgaWYobCA9PSByKSByZXR1cm4gdHJlZVtub2RlXSArPSB2YWw7CiAgICAgICAgaWYoaWR4IDw9IG1pZCkgcmV0dXJuIHRyZWVbbm9kZV0gPSBtZXJnZShhZGQobCwgbWlkLCBMLCBpZHgsIHZhbCksIHRyZWVbUl0pOwogICAgICAgIGVsc2UgcmV0dXJuIHRyZWVbbm9kZV0gPSBtZXJnZSh0cmVlW0xdLCBhZGQobWlkICsgMSwgciwgUiwgaWR4LCB2YWwpKTsKICAgIH0KCiAgICBpbnQgcXVlcnkoaW50IGwsIGludCByLCBpbnQgbm9kZSwgaW50IHRsLCBpbnQgdHIpewogICAgICAgIGlmKHRsID4gciB8fCB0ciA8IGwpIHJldHVybiBza2lwOwogICAgICAgIGlmKGwgPj0gdGwgJiYgciA8PSB0cikgcmV0dXJuIHRyZWVbbm9kZV07CiAgICAgICAgcmV0dXJuIG1lcmdlKHF1ZXJ5KGwsIG1pZCwgTCwgdGwsIHRyKSwgcXVlcnkobWlkICsgMSwgciwgUiwgdGwsIHRyKSk7CiAgICB9CgogICAgU2VnbWVudFRyZWVTKHZlY3RvciA8aW50PiAmYSl7CiAgICAgICAgaW50IG4gPSAoaW50KWEuc2l6ZSgpOyBzeiA9IDE7CiAgICAgICAgd2hpbGUoc3ogPD0gbikgc3ogKj0gMjsKICAgICAgICB0cmVlID0gdmVjdG9yIDxpbnQ+ICgyICogc3osIHNraXApOwogICAgICAgIGJ1aWxkKDAsIHN6IC0gMSwgMCwgYSk7CiAgICB9CgogICAgU2VnbWVudFRyZWVTKGludCBuKXsKICAgICAgICBzeiA9IDE7CiAgICAgICAgd2hpbGUoc3ogPD0gbikgc3ogKj0gMjsKICAgICAgICB0cmVlID0gdmVjdG9yIDxpbnQ+ICgyICogc3osIHNraXApOwogICAgfQoKICAgIHZvaWQgdXBkYXRlKGludCBpZHgsIGludCB2YWwpeyB1cGRhdGUoMCwgc3ogLSAxLCAwLCBpZHgsIHZhbCk7IH0KICAgIHZvaWQgYWRkKGludCBpZHgsIGludCB2YWwpeyBhZGQoMCwgc3ogLSAxLCAwLCBpZHgsIHZhbCk7IH0KICAgIGludCBxdWVyeShpbnQgbCwgaW50IHIpeyAgcmV0dXJuIHF1ZXJ5KDAsIHN6IC0gMSwgMCwgbCwgcik7IH0KCiN1bmRlZiBSCiN1bmRlZiBMCiN1bmRlZiBtaWQKfTsKI3VuZGVmIGludAoKCgoKbGwgcG93ZXIobGwgYixsbCBuKQogICAgewogICAgICAgIGIlPU1PRDsKICAgICAgICBsbCBzPTE7CiAgICAgICAgd2hpbGUobikKICAgICAgICB7CiAgICAgICAgICAgIGlmKG4lMj09MSlzPXMqYiVNT0Q7CiAgICAgICAgICAgIGI9YipiJU1PRDsKICAgICAgICAgICAgbi89MjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHM7CiAgICB9CnZvaWQgc29sdmUoKSB7CiAgbGwgbjsKICBjaW4gPj4gbjsKICB2ZWN0b3I8bGw+IHYobik7CiAgbGwgcTsKICBjaW4gPj4gcTsKICB2ZWN0b3I8bGw+IHN1bW0obik7CgogIGZvciAobGwgaSA9IDA7IGkgPCBuOyBpKyspewogICAgY2luID4+IHZbaV07CiAgICBzdW1tW2ldPWRpdnYoZGl2dih2W2ldLDEwMCksZGl2digxMDAtdltpXSwxMDApKTsKICAgIHZbaV09ZGl2digxMDAtdltpXSwxMDApOwogIH0KICBTZWdtZW50VHJlZVAgc3Aodik7CiAgU2VnbWVudFRyZWVTIHNzKHN1bW0pOwogIHdoaWxlIChxLS0pIHsKICAgIGxsIHQ7CiAgICBjaW4gPj4gdDsKICAgIGlmICh0ID09IDEpIHsKICAgICAgbGwgaW5kLHZhbDsKICAgICAgY2luID4+IGluZD4+dmFsOwogICAgICBzcC51cGRhdGUoaW5kLTEsZGl2digxMDAtdmFsLDEwMCkpOwogICAgICBzcy51cGRhdGUoaW5kLTEsZGl2dihkaXZ2KHZhbCwxMDApLGRpdnYoMTAwLXZhbCwxMDApKSk7CiAgICB9CiAgICBlbHNlewogICAgICAgIGxsIGluZDsKICAgICAgICBjaW4gPj4gaW5kOwogICAgICAgIC8vcHJvZHVjdCArIHByb2R1Y3Qqc3VtCiAgICAgICAgbGwgZj1zcC5xdWVyeShpbmQsbi0xKTsKICAgICAgICBsbCBzPXNzLnF1ZXJ5KGluZCxuLTEpOwogICAgICAgIGNvdXQgPDwgYWRkZChmLChtdWwoZixzKSkpPDxlbmRsOwogICAgfQogIH0KfQoKaW50IG1haW4oKSB7CiAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgY2luLnRpZSgwKTsKICBjb3V0LnRpZSgwKTsKICBsbCB0ID0gMTsKICAvLyBjaW4gPj4gdDsKICB3aGlsZSAodC0tKSB7CiAgICBzb2x2ZSgpOwogIH0KICByZXR1cm4gMDsKfQ==