제출 #1235749

#제출 시각아이디문제언어결과실행 시간메모리
1235749M_SH_OFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
272 ms12092 KiB
/*#pragma GCC optimize("O3") #pragma GCC optimization("Ofast,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")*/ #include <bits/stdc++.h> /*#include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp>*/ #define ll long long #define ll1 long long #define ull unsigned long long #define dou long double #define str string #define vll vector<ll> #define vi vector<int> #define pll pair<ll, ll> #define vpll vector<pll> #define vbool vector<bool> #define vstr vector<str> #define vvll vector<vll> #define pb push_back #define pf push_front #define endl "\n" #define fr first #define se second // #define sortcmp(a) sort(a.begin(), a.end(), cmp) #define sort(a) sort(a.begin(), a.end()) #define reverse(a) reverse(a.begin(), a.end()) #define speed ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0) #define INF 1000000000000000000 #define ordered_set tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update> using namespace std; //using namespace __gnu_pbds; mt19937 rng(time(0)); ll randll(ll l, ll r){ return uniform_int_distribution<ll>(l, r)(rng); } vll tree; void bt(ll v, ll tl, ll tr, vll& a) { if (tl == tr) { tree[v] = a[tl]; return; } ll tm = (tl+tr)/2; bt(v*2, tl, tm, a); bt(v*2+1, tm+1, tr, a); } void upd(ll l, ll r, ll d, ll v, ll tl, ll tr) { if (l <= tl && tr <= r) { tree[v] += d; return; } if (tl > r || tr < l) return; ll tm = (tl+tr)/2; upd(l, r, d, v*2, tl, tm); upd(l, r, d, v*2+1, tm+1, tr); } ll get(ll idx, ll v, ll tl, ll tr) { if (tl == tr) return tree[v]; ll tm = (tl+tr)/2; if (idx <= tm) return tree[v]+get(idx, v*2, tl, tm); return tree[v]+get(idx, v*2+1, tm+1, tr); } int main(){ speed; srand(time(0)); ll n, q, s, t; cin >> n >> q >> s >> t; vll a(n+1); ll res = 0; for (int i = 0; i < n+1; i ++) { cin >> a[i]; } tree.resize(n*4+7, 0); bt(1, 0, n, a); for (int i = 0; i < n; i ++) { if (a[i] < a[i+1]) res -= (a[i+1]-a[i])*s; else res += (a[i]-a[i+1])*t; } //cout << res << endl; while (q --) { ll l, r, d; cin >> l >> r >> d; ll k = get(l-1, 1, 0, n), k1 = get(l, 1, 0, n); if (k < k1) res += (k1-k)*s; else res -= (k-k1)*t; k = get(r, 1, 0, n), k1 = get(r+1, 1, 0, n); if (k < k1) res += (k1-k)*s; else res -= (k-k1)*t; upd(l, r, d, 1, 0, n); k = get(l-1, 1, 0, n), k1 = get(l, 1, 0, n); if (k < k1) res -= (k1-k)*s; else res += (k-k1)*t; k = get(r, 1, 0, n), k1 = get(r+1, 1, 0, n); if (k < k1) res -= (k1-k)*s; else res += (k-k1)*t; cout << res << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...