Submission #568225

#TimeUsernameProblemLanguageResultExecution timeMemory
568225maomao90Sprinkler (JOI22_sprinkler)C++17
41 / 100
4113 ms299064 KiB
// Hallelujah, praise the one who set me free // Hallelujah, death has lost its grip on me // You have broken every chain, There's salvation in your name // Jesus Christ, my living hope #include <bits/stdc++.h> using namespace std; template <class T> inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;} #define REP(i, s, e) for (int i = s; i < e; i++) #define RREP(i, s, e) for (int i = s; i >= e; i--) typedef long long ll; typedef long double ld; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; typedef tuple<int, int, int> iii; #define ALL(_a) _a.begin(), _a.end() #define SZ(_a) (int) _a.size() #define pb push_back typedef vector<int> vi; typedef vector<ll> vll; typedef vector<ii> vii; typedef vector<iii> viii; #ifndef DEBUG #define cerr if (0) cerr #endif const int INF = 1000000005; const ll LINF = 1000000000000000005ll; const int MAXN = 400005; const int MAXD = 41; int n, l; vii adj[MAXN]; int h[MAXN]; int q; int m; ii p[MAXN]; int pre[MAXN], pst[MAXN], ptr = 1; void dfs(int u) { REP (i, 0, adj[u].size()) { if (adj[u][i].FI == p[u].FI) { swap(adj[u][i], adj[u][SZ(adj[u]) - 1]); break; } } pre[u] = ptr; for (auto &[v, id] : adj[u]) { if (v == p[u].FI) continue; id = ptr++; p[v] = {u, id}; } pst[u] = ptr; for (auto [v, id] : adj[u]) { if (v == p[u].FI) continue; dfs(v); } } void fwincre(int i, int x, int *fw) { for (; i <= MAXD; i += i & -i) fw[i] = (ll) fw[i] * x % l; } int fwqry(int i, int *fw) { int res = 1; for (; i > 0; i -= i & -i) res = (ll) res * fw[i] % l; return res; } int st[MAXN * 4][MAXD + 1]; void incre(int p, int l, int x) { int u = p + m; while (u) { fwincre(l, x, st[u]); u >>= 1; } } int qry(int s, int e, int l) { int a = s + m, b = e + m; int res = 1; while (a < b) { if (a & 1) { res = (ll) res * fwqry(l, st[a]) % ::l; a++; } if (b & 1) { b--; res = (ll) res * fwqry(l, st[b]) % ::l; } a >>= 1; b >>= 1; } return res; } int main() { #ifndef DEBUG ios::sync_with_stdio(0), cin.tie(0); #endif cin >> n >> l; REP (i, 1, n) { int a, b; cin >> a >> b; adj[a].pb({b, 0}); adj[b].pb({a, 0}); } int on = n; REP (i, 2, n + 1) { if (adj[i].size() == 1) { adj[i].pb({++on, 0}); adj[on].pb({i, 0}); } } dfs(1); m = 1; while (m < ptr) { m <<= 1; } REP (i, 0, MAXN * 4) { REP (j, 0, MAXD + 1) { st[i][j] = 1; } } REP (i, 1, n + 1) { cin >> h[i]; } cin >> q; while (q--) { int t; cin >> t; if (t == 1) { int x, d, w; cin >> x >> d >> w; int u = x; REP (i, MAXD - d + 1, MAXD + 1) { if (p[u].FI == 0) break; int id = p[u].SE; u = p[u].FI; cerr << "+ " << id << ' ' << i << ' ' << w << '\n'; incre(id, i, w); } u = x; REP (i, MAXD - d, MAXD + 1) { if (adj[u][0].FI == p[u].FI) break; int id = adj[u][0].SE; u = adj[u][0].FI; cerr << "+ " << id << ' ' << i << ' ' << w << '\n'; incre(id, i, w); } } else { int x; cin >> x; ll ans = h[x]; ans = ans * qry(pre[x], pst[x], MAXD) % l; int u = x; RREP (i, MAXD - 1, 1) { if (p[u].FI == 0) break; int id = p[u].SE; u = p[u].FI; ans = ans * qry(pre[u], id, i) % l; ans = ans * qry(id + 1, pst[u], i) % l; } cout << ans << '\n'; } } return 0; } /* 6 10 5 6 1 2 1 4 2 6 3 6 9 2 3 4 9 1 100 1 4 1 9 2 1 */

Compilation message (stderr)

sprinkler.cpp: In function 'void dfs(int)':
sprinkler.cpp:13:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 | #define REP(i, s, e) for (int i = s; i < e; i++)
......
   48 |     REP (i, 0, adj[u].size()) {
      |          ~~~~~~~~~~~~~~~~~~~            
sprinkler.cpp:48:5: note: in expansion of macro 'REP'
   48 |     REP (i, 0, adj[u].size()) {
      |     ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...