Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define MAX 100005
- #define MOD 1000000007
- ll po[MAX], lvl[MAX], st[MAX], tim = 0, par[MAX], ed[MAX];
- vector<ll> adj[MAX];
- ll val[MAX];
- ll tree[4*MAX];
- void gen()
- {
- for(ll i=0; i<MAX; i++) adj[i].clear();
- memset(val, 0, sizeof val);
- tim = 0;
- memset(tree, 0, sizeof tree);
- }
- ll bigMod(ll a, ll p)
- {
- if(p == 0) return 1;
- if(p == 1) return a;
- ll ret = bigMod(a, p/2);
- ret = (ret*ret)%MOD;
- if(p & 1) ret = (ret*a)%MOD;
- return ret;
- }
- ll calc(ll p, ll x)
- {
- ll lob = p, hor = po[x];
- hor = bigMod(hor, MOD-2);
- ll ans = (lob*hor)%MOD;
- return ans;
- }
- void dfs(ll u, ll p, ll l)
- {
- lvl[u] = l;
- ++tim;
- st[u] = tim;
- par[u] = p;
- for(ll i=0; i<adj[u].size(); i++){
- ll v = adj[u][i];
- if(v != p){
- dfs(v, u, l-1);
- }
- }
- ed[u] = tim;
- }
- void update(ll node, ll b, ll e, ll pos, ll p, ll x)
- {
- if(pos > e || pos < b) return;
- if(b == e && pos == b){
- tree[node] = calc(p, x);
- //cout << "HI " << p << " " << x << " " << calc(p, x) << endl;
- return;
- }
- ll left = 2*node;
- ll right = 2*node+1;
- ll mid = (b+e)/2;
- update(left, b, mid, pos, p, x);
- update(right, mid+1, e, pos, p, x);
- tree[node] = (tree[left]+tree[right])%MOD;
- }
- ll query(ll node, ll b, ll e, ll l, ll r)
- {
- if(l > r || l > e || r < b) return 0;
- if(b >= l && e <= r){
- return tree[node];
- }
- ll left = 2*node;
- ll right = 2*node+1;
- ll mid = (b+e)/2;
- ll q1 = query(left, b, mid, l, r);
- ll q2 = query(right, mid+1, e, l, r);
- return (q1+q2)%MOD;
- }
- int main()
- {
- //freopen("in.txt", "r", stdin);
- //freopen("out.txt", "w", stdout);
- po[0] = 1;
- for(ll i=1; i<MAX; i++) po[i] = (po[i-1]*2)%MOD;
- ll cases;
- scanf("%lld", &cases);
- ll caseno = 0;
- while(cases--){
- printf("Case %lld:\n", ++caseno);
- gen();
- ll n;
- scanf("%lld", &n);
- for(ll i=1; i<n; i++){
- ll u, v;
- scanf("%lld %lld", &u, &v);
- adj[u].push_back(v);
- adj[v].push_back(u);
- }
- dfs(1, -1, n);
- ll q;
- scanf("%lld", &q);
- while(q--){
- ll type;
- scanf("%lld", &type);
- if(type == 2){
- ll node, p;
- scanf("%lld %lld", &node, &p);
- p = (p+MOD)%MOD;
- val[node] += p;
- val[node] = val[node]%MOD;
- ll l = lvl[node];
- node = par[node];
- if(node != -1){
- update(1, 1, tim, node, p, l);
- }
- }
- else {
- ll node;
- scanf("%lld", &node);
- ll q = query(1, 1, tim, st[node], ed[node]);
- ll l = lvl[node];
- q = (q*po[l-1])%MOD;
- q += val[node];
- q = q%MOD;
- printf("%lld\n", q);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment