제출 #1175110

#제출 시각아이디문제언어결과실행 시간메모리
1175110Zero_OPArboras (RMI20_arboras)C++20
11 / 100
5092 ms3348 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i, l, r) for(int i = (l); i < (r); ++i) #define ROF(i, r, l) for(int i = (r)-1; i >= (l); --i) #define mp make_pair #define mt make_tuple #define ff first #define ss second #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) #define pb push_back #define eb emplace_back #define sz(v) (int)v.size() #define compact(v) v.erase(unique(all(v)), end(v)) #define dbg(x) "[" #x " = " << (x) << "]" template<typename T> bool minimize(T& a, const T& b){ if(a > b) return a = b, true; return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; using db = double; using ld = long double; using ull = unsigned long long; using pi = pair<int, int>; using pl = pair<ll, ll>; using vi = vector<int>; using vl = vector<ll>; using vd = vector<db>; using vc = vector<char>; using vb = vector<bool>; using vpi = vector<pi>; using vpl = vector<pl>; using vvi = vector<vi>; using vvl = vector<vl>; using vvc = vector<vc>; void setIO(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("task.inp", "r", stdin); freopen("task.out", "w", stdout); #endif // LOCAL } const int MAX = 1e5 + 5; const int mod = 1e9 + 7; struct mint{ int v; mint(int v = 0) : v(v) {} mint& operator += (const mint& o){ v += o.v; if(v >= mod) v -= mod; return *this; } mint& operator -= (const mint& o){ v -= o.v; if(v < 0) v += mod; return *this; } mint& operator *= (const mint& o){ v -= o.v; if(v < 0) v += mod; return *this; } mint power(ll n) const { mint res(1), base = *this; for(; n > 0; n >>= 1, base *= base){ if(n & 1) res *= base; } return res; } mint inv() const { return power(mod-2); } mint& operator /= (const mint& o){ return *this *= o.inv(); } friend mint operator + (mint a, const mint& b){ return a += b; } friend mint operator - (mint a, const mint& b){ return a -= b; } friend mint operator * (mint a, const mint& b){ return a *= b; } friend mint operator / (mint a, const mint& b){ return a /= b; } friend ostream& operator << (ostream& out, const mint& o){ return out << o.v; } friend bool operator == (const mint& a, const mint& b){ return a.v == b.v; } friend bool operator != (const mint& a, const mint& b){ return a.v != b.v; } }; int N, p[MAX]; ll d[MAX]; ll f1[MAX], f2[MAX]; mint calc(){ mint ans = 0; FOR(i, 0, N) f1[i] = 0, f2[i] = 0; ROF(i, N, 1){ ans += mint((f1[i] + f2[i]) % mod); if(f1[p[i]] < f1[i] + d[i]){ f2[p[i]] = f1[p[i]]; f1[p[i]] = f1[i] + d[i]; } else maximize(f2[p[i]], f1[i] + d[i]); } ans += mint((f1[0] + f2[0]) % mod); return ans; } int main(){ setIO(); cin >> N; FOR(i, 1, N) cin >> p[i]; FOR(i, 1, N) cin >> d[i]; cout << calc() << '\n'; int Q; cin >> Q; while(Q--){ int v, add; cin >> v >> add; d[v] += add; cout << calc() << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...