Submission #982532

#TimeUsernameProblemLanguageResultExecution timeMemory
982532stefdascaSimple (info1cup19_simple)C++14
100 / 100
333 ms40916 KiB
/* simple : given a array of n elements and q queries(type 0, add a to every element in range [x, y], type 1, find the max odd number and the min even number from range [x, y]), answer to the queries of type 1) Classical lazy propagation task */ #include<bits/stdc++.h> using namespace std; int n, q; long long v[200002], aint[5][800002], lazy[800002]; long long Minpar, Maximpar; void build(int nod, int st, int dr) { if(st == dr) { aint[0][nod] = aint[2][nod] = (1LL<<60); aint[1][nod] = aint[3][nod] = -(1LL<<60); if(v[st] % 2 == 0) aint[0][nod] = aint[1][nod] = v[st]; else aint[2][nod] = aint[3][nod] = v[st]; return; } int mid = (st + dr) / 2; build(nod << 1, st, mid); build(nod << 1|1, mid + 1, dr); long long minpar = (1LL<<60); if(aint[0][2 * nod] != (1LL<<60)) minpar = min(minpar, aint[0][nod * 2]); if(aint[0][2 * nod + 1] != (1LL<<60)) minpar = min(minpar, aint[0][nod * 2 + 1]); aint[0][nod] = minpar; long long maxpar = -(1LL<<60); if(aint[1][2 * nod] != -(1LL<<60)) maxpar = max(maxpar, aint[1][nod * 2]); if(aint[1][2 * nod + 1] != -(1LL<<60)) maxpar = max(maxpar, aint[1][nod * 2 + 1]); aint[1][nod] = maxpar; minpar = (1LL<<60); if(aint[2][2 * nod] != (1LL<<60)) minpar = min(minpar, aint[2][nod * 2]); if(aint[2][2 * nod + 1] != (1LL<<60)) minpar = min(minpar, aint[2][nod * 2 + 1]); aint[2][nod] = minpar; maxpar = -(1LL<<60); if(aint[3][2 * nod] != -(1LL<<60)) maxpar = max(maxpar, aint[3][nod * 2]); if(aint[3][2 * nod + 1] != -(1LL<<60)) maxpar = max(maxpar, aint[3][nod * 2 + 1]); aint[3][nod] = maxpar; } void update(int nod, int st, int dr, int l, int r, int val) { if(l <= st && dr <= r) lazy[nod] += val; if(lazy[nod]) { if(aint[0][nod] != (1LL<<60)) aint[0][nod] += lazy[nod], aint[1][nod] += lazy[nod]; if(aint[2][nod] != (1LL<<60)) aint[2][nod] += lazy[nod], aint[3][nod] += lazy[nod]; if(lazy[nod] % 2 == 1) { swap(aint[0][nod], aint[2][nod]); swap(aint[1][nod], aint[3][nod]); } if(st != dr) { lazy[2 * nod] += lazy[nod]; lazy[2 * nod + 1] += lazy[nod]; } lazy[nod] = 0; } if(dr < l || st > r) return; if(l <= st && dr <= r) return; int mid = (st + dr) / 2; update(nod * 2, st, mid, l, r, val); update(nod * 2 + 1, mid + 1, dr, l, r, val); long long minpar = (1LL<<60); if(aint[0][2 * nod] != (1LL<<60)) minpar = min(minpar, aint[0][nod * 2]); if(aint[0][2 * nod + 1] != (1LL<<60)) minpar = min(minpar, aint[0][nod * 2 + 1]); aint[0][nod] = minpar; long long maxpar = -(1LL<<60); if(aint[1][2 * nod] != -(1LL<<60)) maxpar = max(maxpar, aint[1][nod * 2]); if(aint[1][2 * nod + 1] != -(1LL<<60)) maxpar = max(maxpar, aint[1][nod * 2 + 1]); aint[1][nod] = maxpar; minpar = (1LL<<60); if(aint[2][2 * nod] != (1LL<<60)) minpar = min(minpar, aint[2][nod * 2]); if(aint[2][2 * nod + 1] != (1LL<<60)) minpar = min(minpar, aint[2][nod * 2 + 1]); aint[2][nod] = minpar; maxpar = -(1LL<<60); if(aint[3][2 * nod] != -(1LL<<60)) maxpar = max(maxpar, aint[3][nod * 2]); if(aint[3][2 * nod + 1] != -(1LL<<60)) maxpar = max(maxpar, aint[3][nod * 2 + 1]); aint[3][nod] = maxpar; } void query(int nod, int st, int dr, int l, int r) { if(lazy[nod]) { if(aint[0][nod] != (1LL<<60)) aint[0][nod] += lazy[nod], aint[1][nod] += lazy[nod]; if(aint[2][nod] != (1LL<<60)) aint[2][nod] += lazy[nod], aint[3][nod] += lazy[nod]; if(lazy[nod] % 2 == 1) { swap(aint[0][nod], aint[2][nod]); swap(aint[1][nod], aint[3][nod]); } if(st != dr) { lazy[2 * nod] += lazy[nod]; lazy[2 * nod + 1] += lazy[nod]; } lazy[nod] = 0; } if(dr < l || st > r) return; if(l <= st && dr <= r) { if(aint[0][nod]) Minpar = min(Minpar, aint[0][nod] + lazy[nod]); if(aint[3][nod]) Maximpar = max(Maximpar, aint[3][nod] + lazy[nod]); return; } int mid = (st + dr) / 2; query(nod * 2, st, mid, l, r); query(nod * 2 + 1, mid + 1, dr, l, r); long long minpar = (1LL<<60); if(aint[0][2 * nod] != (1LL<<60)) minpar = min(minpar, aint[0][nod * 2]); if(aint[0][2 * nod + 1] != (1LL<<60)) minpar = min(minpar, aint[0][nod * 2 + 1]); aint[0][nod] = minpar; long long maxpar = -(1LL<<60); if(aint[1][2 * nod] != -(1LL<<60)) maxpar = max(maxpar, aint[1][nod * 2]); if(aint[1][2 * nod + 1] != -(1LL<<60)) maxpar = max(maxpar, aint[1][nod * 2 + 1]); aint[1][nod] = maxpar; minpar = (1LL<<60); if(aint[2][2 * nod] != (1LL<<60)) minpar = min(minpar, aint[2][nod * 2]); if(aint[2][2 * nod + 1] != (1LL<<60)) minpar = min(minpar, aint[2][nod * 2 + 1]); aint[2][nod] = minpar; maxpar = -(1LL<<60); if(aint[3][2 * nod] != -(1LL<<60)) maxpar = max(maxpar, aint[3][nod * 2]); if(aint[3][2 * nod + 1] != -(1LL<<60)) maxpar = max(maxpar, aint[3][nod * 2 + 1]); aint[3][nod] = maxpar; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; for(int i = 1; i <= n; ++i) cin >> v[i]; build(1, 1, n); cin >> q; for(int i = 1; i <= q; ++i) { int tip; cin >> tip; if(tip == 0) { int a, b, val; cin >> a >> b >> val; update(1, 1, n, a, b, val); } else { int a, b; cin >> a >> b; Maximpar = -(1LL<<60); Minpar = (1LL<<60); query(1, 1, n, a, b); if(Minpar == (1LL<<60)) cout << -1 << " "; else cout << Minpar << " "; if(Maximpar == -(1LL<<60)) cout << -1 << '\n'; else cout << Maximpar << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...