Submission #690930

#TimeUsernameProblemLanguageResultExecution timeMemory
690930divadSimple (info1cup19_simple)C++14
100 / 100
307 ms41776 KiB
#include <iostream> #define int long long #define lc (nod<<1) #define rc ((nod<<1)|1) #define INF (1ULL<<60) #define MAX 200002 using namespace std; int n,q,t,x,y,v,mini,maxi; struct Nod{ int maximp = -1; int minimp = INF; int maxpar = -1; int minpar = INF; int lazy; } aint[4*MAX]; void merge(int nod){ aint[nod].maximp = max(aint[lc].maximp, aint[rc].maximp); aint[nod].minimp = min(aint[lc].minimp, aint[rc].minimp); aint[nod].maxpar = max(aint[lc].maxpar, aint[rc].maxpar); aint[nod].minpar = min(aint[lc].minpar, aint[rc].minpar); } void change(int nod, int val){ if(aint[nod].maximp != -1){ aint[nod].maximp += val; aint[nod].minimp += val; } if(aint[nod].maxpar != -1){ aint[nod].maxpar += val; aint[nod].minpar += val; } if(val%2 == 0){ }else{ swap(aint[nod].maxpar, aint[nod].maximp); swap(aint[nod].minpar, aint[nod].minimp); } } void propag(int nod){ if(aint[nod].lazy != 0){ aint[lc].lazy += aint[nod].lazy; change(lc, aint[nod].lazy); aint[rc].lazy += aint[nod].lazy; change(rc, aint[nod].lazy); aint[nod].lazy = 0; } } void build(int nod, int st, int dr){ if(st == dr){ cin >> x; if(x%2 == 0){ aint[nod].maxpar = aint[nod].minpar = x; }else{ aint[nod].maximp = aint[nod].minimp = x; } }else{ int mid = ((st+dr)>>1); build(lc, st, mid); build(rc, mid+1, dr); merge(nod); } } void update(int nod, int st, int dr, int a, int b, int val){ /// v[a..b] += val if(a <= st && dr <= b){ aint[nod].lazy += val; change(nod, val); }else{ propag(nod); int mid = ((st+dr)>>1); if(a <= mid){ update(lc, st, mid, a, b, val); } if(b >= mid+1){ update(rc, mid+1, dr, a, b, val); } merge(nod); } } void query(int nod, int st, int dr, int a, int b){ /// maxim impar si minim par din [a..b] if(a <= st && dr <= b){ maxi = max(maxi, aint[nod].maximp); mini = min(mini, aint[nod].minpar); }else{ propag(nod); int mid = ((st+dr)>>1); if(a <= mid){ query(lc, st, mid, a, b); } if(b >= mid+1){ query(rc, mid+1, dr, a, b); } merge(nod); } } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n; build(1, 1, n); cin >> q; while(q--){ cin >> t >> x >> y; if(t == 0){ cin >> v; update(1, 1, n, x, y, v); }else{ mini = INF; maxi = -1; query(1, 1, n, x, y); cout << (mini == INF ? -1 : mini) << " " << maxi << "\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...