This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
int pmin, pmax, imin, imax, lazy;
node()
{
pmin = pmax = imin = imax = -1;
lazy = 0;
}
void operator = (vector<int>v)
{
pmin = v[0], pmax = v[1], imin = v[2], imax = v[3], lazy = v[4];
}
};
node operator + (node a, node b)
{
node ans;
if (a.pmin == -1)
ans.pmin = b.pmin;
else if (b.pmin == -1)
ans.pmin = a.pmin;
else
ans.pmin = min(a.pmin, b.pmin);
if (a.pmax == -1)
ans.pmax = b.pmax;
else if (b.pmax == -1)
ans.pmax = a.pmax;
else
ans.pmax = max(a.pmax, b.pmax);
if (a.imin == -1)
ans.imin = b.imin;
else if (b.imin == -1)
ans.imin = a.imin;
else
ans.imin = min(a.imin, b.imin);
if (a.imax == -1)
ans.imax = b.imax;
else if (b.imax == -1)
ans.imax = a.imax;
else
ans.imax = max(a.imax, b.imax);
return ans;
}
class ST
{
protected:
int n;
vector<node>a;
public:
void init (int N)
{
n = 1;
while (n < N)
n <<= 1;
n <<= 1;
n++;
a.resize(n);
}
void propagate (int nod, int st, int dr)
{
if (a[nod].lazy)
{
int lazy = a[nod].lazy;
if (lazy % 2 == 0)
{
if (a[nod].pmin != -1)
{
a[nod].pmin += lazy;
a[nod].pmax += lazy;
}
if (a[nod].imin != -1)
{
a[nod].imin += lazy;
a[nod].imax += lazy;
}
}
else
{
int pmin = a[nod].pmin, pmax = a[nod].pmax;
int imin = a[nod].imin, imax = a[nod].imax;
if (pmin != -1)
{
a[nod].imin = pmin + lazy;
a[nod].imax = pmax + lazy;
}
else
a[nod].imin = a[nod].imax = -1;
if (imin != -1)
{
a[nod].pmin = imin + lazy;
a[nod].pmax = imax + lazy;
}
else
a[nod].pmin = a[nod].pmax = -1;
}
if (st != dr)
{
a[2*nod].lazy += a[nod].lazy;
a[2*nod+1].lazy += a[nod].lazy;
}
a[nod].lazy = 0;
}
}
void build (int nod, int st, int dr)
{
if (st == dr)
{
int x;
cin >> x;
if (x % 2 == 0)
a[nod] = {x, x, -1, -1, 0};
else
a[nod] = {-1, -1, x, x, 0};
}
else
{
int mid = (st + dr) / 2;
build(2*nod, st, mid);
build(2*nod+1, mid+1, dr);
a[nod] = a[2*nod] + a[2*nod+1];
}
}
void update (int nod, int st, int dr, int l, int r, int x)
{
propagate(nod, st, dr);
if (l <= st && dr <= r)
a[nod].lazy += x;
else
{
int mid = (st + dr) / 2;
if (l <= mid)
update(2*nod, st, mid, l, r, x);
if (mid < r)
update(2*nod+1, mid+1, dr, l, r, x);
propagate(2*nod, st, mid);
propagate(2*nod+1, mid+1, dr);
a[nod] = a[2*nod] + a[2*nod+1];
}
}
node query (int nod, int st, int dr, int l, int r)
{
propagate(nod, st, dr);
if (l <= st && dr <= r)
return a[nod];
int mid = (st + dr) / 2;
if (l <= mid && mid < r)
{
node ls = query(2*nod, st, mid, l, r);
node rs = query(2*nod+1, mid+1, dr, l, r);
return ls + rs;
}
if (l <= mid)
{
return query(2*nod, st, mid, l, r);
}
if (mid < r)
{
return query(2*nod+1, mid+1, dr, l, r);
}
}
};
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
ST a;
a.init(n);
a.build(1, 1, n);
int q;
cin >> q;
while (q--)
{
int op;
cin >> op;
if (op == 0)
{
int x, y, val;
cin >> x >> y >> val;
a.update(1, 1, n, x, y, val);
}
else
{
//cout << a[2].pmin << ' ' << a[3].pmin << ' ' << a[4].pmin << '\n';
int x, y;
cin >> x >> y;
node ans = a.query(1, 1, n, x, y);
cout << ans.pmin << ' ' << ans.imax << '\n';
}
}
return 0;
}
Compilation message (stderr)
subway.cpp: In member function 'node ST::query(long long int, long long int, long long int, long long int, long long int)':
subway.cpp:194:5: warning: control reaches end of non-void function [-Wreturn-type]
194 | }
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |