Submission #868016

#TimeUsernameProblemLanguageResultExecution timeMemory
868016tienbinhSterilizing Spray (JOI15_sterilizing)C++17
100 / 100
1018 ms138504 KiB
#include <bits/stdc++.h> using namespace std; #define name "" #define int long long const int N = 5e5 + 7; int n, q, k, a[N]; struct Node{ basic_string<int>val; Node() {} Node(int x) { // Code here while(x > 0){ val += (x % k); x /= k; } } Node(Node l, Node r) { // Code here for(int i = 0 ; i < (int)max(l.val.size() , r.val.size()); i++) val += (i < (int)l.val.size() ? l.val[i] : 0 ) + (i < (int)r.val.size() ? r.val[i] : 0); } explicit operator long long() { long long res = 0; reverse(val.begin(), val.end()); for (int i : val) res = res * k + i; reverse(val.begin(), val.end()); return res; } } st[N << 2]; struct Update { int cnt_div = 0; Update() {} Update(int x) : cnt_div(x) {} Update(Update l, Update r) { cnt_div = l.cnt_div + r.cnt_div; } } lazy[N << 2]; Node identity_value() { return Node(); } Node merge(Node a, Node b) { return Node(a, b); } Update identity_update() { return Update(); } Node apply_update(Update v, Node x) { // Code here // for(int i = 0 ; i < v.cnt_div ; i++){ // if(!x.val.empty()) x.val.erase(x.val.begin()); // } Node res; for (int i = v.cnt_div; i < (int)x.val.size(); i++) res.val += x.val[i]; return res; } Update merge_update(Update a, Update b) { return Update(a, b); } void recalc(int id) { st[id] = merge(st[id << 1], st[id << 1 | 1]); } void build(int id = 1, int l = 1, int r = n) { // Code here if (l == r) return st[id] = Node(a[l]), void(); int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); recalc(id); } void apply(int id, Update upd) { st[id] = apply_update(upd, st[id]); lazy[id] = merge_update(lazy[id], upd); } void down(int id) { apply(id << 1, lazy[id]), apply(id << 1 | 1, lazy[id]); lazy[id] = identity_update(); } Node query(int u, int v, int id = 1, int l = 1, int r = n) { if (v < l || u > r) return identity_value(); if (u <= l && r <= v) return st[id]; down(id); int mid = (l + r) >> 1; return merge(query(u, v, id << 1, l, mid), query(u, v, id << 1 | 1, mid + 1, r)); } void update(int u, int v, Update upd, int id = 1, int l = 1, int r = n) { if (v < l || u > r) return; if (u <= l && r <= v) return apply(id, upd); down(id); int mid = (l + r) >> 1; update(u, v, upd, id << 1, l, mid); update(u, v, upd, id << 1 | 1, mid + 1, r); recalc(id); } void assign(int p, int v, int id = 1, int l = 1, int r = n) { if (l == r) return st[id] = Node(v), void(); down(id); int mid = (l + r) >> 1; if (p <= mid) assign(p, v, id << 1, l, mid); else assign(p, v, id << 1 | 1, mid + 1, r); recalc(id); } namespace k_1{ long long st[N << 2]; void build(int id = 1 , int l = 1 , int r = n){ if(l == r) return st[id] = a[l], void(); int mid = (l + r ) >> 1; build(id << 1, l , mid); build(id << 1 | 1 , mid + 1 , r); st[id] = st[id << 1] + st[id << 1 | 1]; } void update(int p , int v, int id = 1 , int l = 1 , int r = n){ if (l == r) return st[id] = v , void(); int mid = (l + r) >> 1; if(p <= mid) update(p , v, id << 1, l , mid ); else update(p , v, id << 1 | 1, mid + 1 , r); st[id] = st[id << 1] + st[id << 1 | 1]; } long long query(int u, int v, int id = 1, int l = 1, int r = n) { if (v < l || u > r) return 0; if (u <= l && r <= v) return st[id]; // down(id); int mid = (l + r) >> 1; return (query(u, v, id << 1, l, mid) +query(u, v, id << 1 | 1, mid + 1, r)); } } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); if(fopen("bug.inp", "r")) freopen("bug.inp", "r", stdin), freopen("bug.out", "w", stdout); else if (fopen(name".inp", "r")) freopen(name".inp", "r", stdin), freopen(name".out", "w", stdout); cin >> n >> q >> k; for (int i = 1; i <= n; i++) cin >> a[i]; if (k == 1) { k_1::build(); while (q--) { int t, u, v; cin >> t >> u >> v; if (t == 1) k_1::update(u, v); if (t == 3) cout << k_1::query(u, v) << '\n'; } return 0; } build(); while (q--) { int t, u, v; cin >> t >> u >> v; if (t == 1) assign(u, v); if (t == 2) update(u, v, Update(1)); if (t == 3) cout << (long long)query(u, v) << '\n'; } return 0; }

Compilation message (stderr)

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:135:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  135 |         freopen("bug.inp", "r", stdin), freopen("bug.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:135:48: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  135 |         freopen("bug.inp", "r", stdin), freopen("bug.out", "w", stdout);
      |                                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:137:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  137 |         freopen(name".inp", "r", stdin), freopen(name".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
sterilizing.cpp:137:49: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  137 |         freopen(name".inp", "r", stdin), freopen(name".out", "w", stdout);
      |                                          ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...