#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define is insert
#define pb push_back
#define eb emplace_back
#define pii pair<int, int>
#define pll pair<long long, long long>
#define X first
#define Y second
#define vi vector<int>
#define vpi vector<pair<int, int>>
#define msi multiset<int>
#define int long long
const int m83 = 998244353;
const int m97 = (int)1e9+7;
const int N = 200005;
const int K = 5;
const int inf = (int)1e18;
int n, q, pa[N], dep[N], tin[N], tout[N] ,sz[N], cid[N], ch[N], arr[N], nxt[N], curc, curid, timer = 1, pos[N];
pii a[N];
vi adj[N];
pii merge(pii f1, pii f2){
int a = (f2.X * f1.X) % m83;
int b = (f2.X * f1.Y + f2.Y) % m83;
return {a,b};
}
int dfs(int u, int p) {
sz[u] = 1;
pa[u] = p;
dep[u] = ( p <0 ? 0: dep[p]+1);
int mx = 0;
nxt[u] = 0;
for (int v: adj[u]){
if(v != p){
int s = dfs(v,u);
sz[u] += s;
if (s > mx) {
mx = s;
nxt[u] = v;
}
}
}
return sz[u];
}
void decompose(int u, int h){
ch[u] = h;
pos[u] = ++curid;
arr[curid] = u;
if (nxt[u]) decompose(nxt[u], h);
for(int v: adj[u]){
if (v!=pa[u] && v!=nxt[u]){
decompose(v, v);
}
}
}
pii stl[4*N], str[4*N];
void build(int id, int l, int r){
if(l == r){
stl[id] = str[id] = a[arr[l]];
return;
}
int mid = (l + r) >> 1;
build(2*id, l, mid);
build(2*id+1, mid+1, r);
stl[id] = merge(stl[2*id], stl[2*id+1]);
str[id] = merge(str[2*id+1], str[2*id]);
}
void update(int id, int l, int r, int pos, pii val){
if(l > pos || r < pos) return;
if(l == pos && r == pos){
stl[id] = str[id] = val;
return;
}
int mid = (l + r) >> 1;
update(2*id, l, mid, pos, val);
update(2*id+1, mid+1, r, pos, val);
stl[id] = merge(stl[2*id], stl[2*id+1]);
str[id] = merge(str[2*id+1], str[2*id]);
}
pii getl(int id, int l, int r, int u, int v){
if(u > r || v < l) return {1, 0};
if(u <= l && r <= v){
return stl[id];
}
int mid = (l + r) >> 1;
return merge(getl(2*id, l, mid, u, v), getl(2*id+1, mid+1, r, u, v));
}
pii getr(int id, int l, int r, int u, int v){
if(u > r || v < l) return {1, 0};
if(u <= l && r <= v){
return str[id];
}
int mid = (l + r) >> 1;
return merge(getr(2*id+1, mid+1, r, u, v), getr(2*id, l, mid, u, v));
}
void path(int u, int v, vpi& up, vpi& dn) {
while (ch[u] != ch[v]){
if (dep[ch[u]] >= dep[ch[v]]) {
up.eb(pos[ch[u]], pos[u]);
u = pa[ch[u]];
}
else{
dn.eb(pos[ch[v]], pos[v]);
v = pa[ch[v]];
}
}
if (dep[u] <= dep[v]) {
dn.eb(pos[u], pos[v]);
}
else{
up.eb(pos[v], pos[u]);
}
}
void solve(){
cin >> n >> q;
for(int i=1, x, y; i<=n; i++){
cin >> x >> y;
x %= m83;
y %= m83;
a[i] = {x, y};
}
for(int i=1, u, v; i<n; i++){
cin >> u >> v;
adj[u].pb(v);
adj[v].pb(u);
}
curc = 1;
curid = 0;
dfs(1, -1);
decompose(1, 1);
build(1, 1, n);
while(q--){
int t; cin >> t;
if(t == 0){
int p, x, y; cin >> p >> x >> y;
update(1, 1, n, pos[p], {x, y});
}
else{
int u, v, x; cin >> u >> v >> x;
vpi up, dn;
path(u, v, up, dn);
int ca = 1, cb = 0;
reverse(dn.begin(), dn.end());
for(pii p : up){
pii f = getr(1, 1, n, p.X, p.Y);
tie(ca, cb) = merge({ca, cb}, f);
}
for(pii p : dn){
pii f = getl(1, 1, n, p.X, p.Y);
tie(ca, cb) = merge({ca, cb}, f);
}
int ans = (ca * x + cb) % m83;
while(ans < 0) ans += m83;
cout << ans << "\n";
}
}
}
signed main(){
// freopen("*.INP", "r", stdin);
// freopen("*.OUT", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int tt = 1; //cin >> tt;
while(tt--){
solve();
}
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGRiIGRvdWJsZQojZGVmaW5lIGlzIGluc2VydAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGViIGVtcGxhY2VfYmFjawojZGVmaW5lIHBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIHBsbCBwYWlyPGxvbmcgbG9uZywgbG9uZyBsb25nPgojZGVmaW5lIFggZmlyc3QKI2RlZmluZSBZIHNlY29uZAojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdnBpIHZlY3RvcjxwYWlyPGludCwgaW50Pj4KI2RlZmluZSBtc2kgbXVsdGlzZXQ8aW50PgojZGVmaW5lIGludCBsb25nIGxvbmcKY29uc3QgaW50IG04MyA9IDk5ODI0NDM1MzsKY29uc3QgaW50IG05NyA9IChpbnQpMWU5Kzc7CmNvbnN0IGludCBOID0gMjAwMDA1Owpjb25zdCBpbnQgSyA9IDU7CmNvbnN0IGludCBpbmYgPSAoaW50KTFlMTg7CgppbnQgbiwgcSwgcGFbTl0sIGRlcFtOXSwgdGluW05dLCB0b3V0W05dICxzeltOXSwgY2lkW05dLCBjaFtOXSwgYXJyW05dLCBueHRbTl0sIGN1cmMsIGN1cmlkLCB0aW1lciA9IDEsIHBvc1tOXTsKcGlpIGFbTl07CnZpIGFkaltOXTsKCnBpaSBtZXJnZShwaWkgZjEsIHBpaSBmMil7CglpbnQgYSA9IChmMi5YICogZjEuWCkgJSBtODM7CiAgICBpbnQgYiA9IChmMi5YICogZjEuWSArIGYyLlkpICUgbTgzOwogICAgcmV0dXJuIHthLGJ9Owp9CgppbnQgZGZzKGludCB1LCBpbnQgcCkgewogICAgc3pbdV0gPSAxOwogICAgcGFbdV0gPSBwOwogICAgZGVwW3VdID0gKCBwIDwwID8gMDogZGVwW3BdKzEpOwogICAgaW50IG14ID0gMDsKICAgIG54dFt1XSA9IDA7CiAgICBmb3IgKGludCB2OiBhZGpbdV0pewogICAgCWlmKHYgIT0gcCl7CgkgICAgICAgIGludCBzID0gZGZzKHYsdSk7CgkgICAgICAgIHN6W3VdICs9IHM7CgkgICAgICAgIGlmIChzID4gbXgpIHsKCSAgICAgICAgICAgIG14ID0gczsKCSAgICAgICAgICAgIG54dFt1XSA9IHY7CgkgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gc3pbdV07Cn0KCnZvaWQgZGVjb21wb3NlKGludCB1LCBpbnQgaCl7CiAgICBjaFt1XSA9IGg7CiAgICBwb3NbdV0gPSArK2N1cmlkOwogICAgYXJyW2N1cmlkXSA9IHU7CiAgICBpZiAobnh0W3VdKSBkZWNvbXBvc2Uobnh0W3VdLCBoKTsKICAgIGZvcihpbnQgdjogYWRqW3VdKXsKICAgIAlpZiAodiE9cGFbdV0gJiYgdiE9bnh0W3VdKXsKICAgIAkJZGVjb21wb3NlKHYsIHYpOwoJCX0KICAgIH0KfQoKcGlpIHN0bFs0Kk5dLCBzdHJbNCpOXTsKCnZvaWQgYnVpbGQoaW50IGlkLCBpbnQgbCwgaW50IHIpewoJaWYobCA9PSByKXsKCQlzdGxbaWRdID0gc3RyW2lkXSA9IGFbYXJyW2xdXTsKCQlyZXR1cm47Cgl9CglpbnQgbWlkID0gKGwgKyByKSA+PiAxOwoJYnVpbGQoMippZCwgbCwgbWlkKTsKCWJ1aWxkKDIqaWQrMSwgbWlkKzEsIHIpOwoJc3RsW2lkXSA9IG1lcmdlKHN0bFsyKmlkXSwgc3RsWzIqaWQrMV0pOwoJc3RyW2lkXSA9IG1lcmdlKHN0clsyKmlkKzFdLCBzdHJbMippZF0pOwp9CgoKdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBwb3MsIHBpaSB2YWwpewoJaWYobCA+IHBvcyB8fCByIDwgcG9zKSByZXR1cm47CglpZihsID09IHBvcyAmJiByID09IHBvcyl7CgkJc3RsW2lkXSA9IHN0cltpZF0gPSB2YWw7CgkJcmV0dXJuOwoJfQoJaW50IG1pZCA9IChsICsgcikgPj4gMTsKCXVwZGF0ZSgyKmlkLCBsLCBtaWQsIHBvcywgdmFsKTsKCXVwZGF0ZSgyKmlkKzEsIG1pZCsxLCByLCBwb3MsIHZhbCk7CglzdGxbaWRdID0gbWVyZ2Uoc3RsWzIqaWRdLCBzdGxbMippZCsxXSk7CglzdHJbaWRdID0gbWVyZ2Uoc3RyWzIqaWQrMV0sIHN0clsyKmlkXSk7Cn0KCnBpaSBnZXRsKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpewoJaWYodSA+IHIgfHwgdiA8IGwpIHJldHVybiB7MSwgMH07CglpZih1IDw9IGwgJiYgciA8PSB2KXsKCQlyZXR1cm4gc3RsW2lkXTsKCX0KCWludCBtaWQgPSAobCArIHIpID4+IDE7CglyZXR1cm4gbWVyZ2UoZ2V0bCgyKmlkLCBsLCBtaWQsIHUsIHYpLCBnZXRsKDIqaWQrMSwgbWlkKzEsIHIsIHUsIHYpKTsKfQoKcGlpIGdldHIoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdil7CglpZih1ID4gciB8fCB2IDwgbCkgcmV0dXJuIHsxLCAwfTsKCWlmKHUgPD0gbCAmJiByIDw9IHYpewoJCXJldHVybiBzdHJbaWRdOwoJfQoJaW50IG1pZCA9IChsICsgcikgPj4gMTsKCXJldHVybiBtZXJnZShnZXRyKDIqaWQrMSwgbWlkKzEsIHIsIHUsIHYpLCBnZXRyKDIqaWQsIGwsIG1pZCwgdSwgdikpOwp9Cgp2b2lkIHBhdGgoaW50IHUsIGludCB2LCB2cGkmIHVwLCB2cGkmIGRuKSB7CiAgICB3aGlsZSAoY2hbdV0gIT0gY2hbdl0pewogICAgICAgIGlmIChkZXBbY2hbdV1dID49IGRlcFtjaFt2XV0pIHsKICAgICAgICAgICAgdXAuZWIocG9zW2NoW3VdXSwgcG9zW3VdKTsKICAgICAgICAgICAgdSA9IHBhW2NoW3VdXTsKICAgICAgICB9CgkJZWxzZXsKICAgICAgICAgICAgZG4uZWIocG9zW2NoW3ZdXSwgcG9zW3ZdKTsKICAgICAgICAgICAgdiA9IHBhW2NoW3ZdXTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZGVwW3VdIDw9IGRlcFt2XSkgewogICAgICAgIGRuLmViKHBvc1t1XSwgcG9zW3ZdKTsKICAgIH0KCWVsc2V7CiAgICAgICAgdXAuZWIocG9zW3ZdLCBwb3NbdV0pOwogICAgfQp9Cgp2b2lkIHNvbHZlKCl7CgljaW4gPj4gbiA+PiBxOwoJZm9yKGludCBpPTEsIHgsIHk7IGk8PW47IGkrKyl7CgkJY2luID4+IHggPj4geTsKCQl4ICU9IG04MzsKCQl5ICU9IG04MzsKCQlhW2ldID0ge3gsIHl9OwoJfQoJZm9yKGludCBpPTEsIHUsIHY7IGk8bjsgaSsrKXsKCQljaW4gPj4gdSA+PiB2OwoJCWFkalt1XS5wYih2KTsKCQlhZGpbdl0ucGIodSk7Cgl9CgljdXJjID0gMTsKCWN1cmlkID0gMDsKCWRmcygxLCAtMSk7CglkZWNvbXBvc2UoMSwgMSk7CglidWlsZCgxLCAxLCBuKTsKCXdoaWxlKHEtLSl7CgkJaW50IHQ7IGNpbiA+PiB0OwoJCWlmKHQgPT0gMCl7CgkJCWludCBwLCB4LCB5OyBjaW4gPj4gcCA+PiB4ID4+IHk7CgkJCXVwZGF0ZSgxLCAxLCBuLCBwb3NbcF0sIHt4LCB5fSk7CgkJfQoJCWVsc2V7CgkJCWludCB1LCB2LCB4OyBjaW4gPj4gdSA+PiB2ID4+IHg7CgkJCXZwaSB1cCwgZG47CgkJCXBhdGgodSwgdiwgdXAsIGRuKTsKCQkJaW50IGNhID0gMSwgY2IgPSAwOwoJCQlyZXZlcnNlKGRuLmJlZ2luKCksIGRuLmVuZCgpKTsKCQkJZm9yKHBpaSBwIDogdXApewoJCQkJcGlpIGYgPSBnZXRyKDEsIDEsIG4sIHAuWCwgcC5ZKTsKCQkJCXRpZShjYSwgY2IpID0gbWVyZ2Uoe2NhLCBjYn0sIGYpOwoJCQl9CgkJCWZvcihwaWkgcCA6IGRuKXsKCQkJCXBpaSBmID0gZ2V0bCgxLCAxLCBuLCBwLlgsIHAuWSk7CgkJCQl0aWUoY2EsIGNiKSA9IG1lcmdlKHtjYSwgY2J9LCBmKTsKCQkJfQoJCQlpbnQgYW5zID0gKGNhICogeCArIGNiKSAlIG04MzsKCQkJd2hpbGUoYW5zIDwgMCkgYW5zICs9IG04MzsKCQkJY291dCA8PCBhbnMgPDwgIlxuIjsKCQl9Cgl9Cn0KCnNpZ25lZCBtYWluKCl7Ci8vCWZyZW9wZW4oIiouSU5QIiwgInIiLCBzdGRpbik7Ci8vICAgIGZyZW9wZW4oIiouT1VUIiwgInciLCBzdGRvdXQpOwogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGludCB0dCA9IDE7IC8vY2luID4+IHR0OwogICAgd2hpbGUodHQtLSl7CiAgICAJc29sdmUoKTsKCX0KfQo=