Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const long long INF = 1e9;
- void build(vector<long long>& z, const vector<long long>& a, int l, int r, int now) {
- if (l > r || l < 0 || r >= a.size()) {
- return;
- }
- if (l == r) {
- z[now] = a[l];
- return;
- }
- int mid = (l + r) / 2;
- build(z, a, l, mid, now * 2);
- build(z, a, mid + 1, r, now * 2 + 1);
- z[now] = min(z[now * 2], z[now * 2 + 1]);
- }
- long long query(vector<long long>& z, int l, int r, int a, int b, int now) {
- if (l > r || a > r || b < l) {
- return INF;
- }
- if (a <= l && r <= b) {
- return z[now];
- }
- if (l == r) {
- return INF;
- }
- int mid = (l + r) / 2;
- long long _1 = query(z, l, mid, a, b, now * 2);
- long long _2 = query(z, mid + 1, r, a, b, now * 2 + 1);
- return min(_1, _2);
- }
- void add(vector<long long>& z, int l, int r, int a, int b, int now, int delta) {
- if (l > r || a > r || b < l) {
- return;
- }
- if (a <= l && r <= b) {
- if (l == r) {
- z[now] += delta;
- }
- else {
- int mid = (l + r) / 2;
- add(z, l, mid, a, b, now * 2, delta);
- add(z, mid + 1, r, a, b, now * 2 + 1, delta);
- z[now] += delta;
- }
- return;
- }
- if (l == r) {
- return;
- }
- int mid = (l + r) / 2;
- add(z, l, mid, a, b, now * 2, delta);
- add(z, mid + 1, r, a, b, now * 2 + 1, delta);
- z[now] = min(z[now * 2], z[now * 2 + 1]);
- }
- void update(vector<long long>& z, int l, int r, int a, int b, int now, int value) {
- if (l > r || a > r || b < l) {
- return;
- }
- if (a <= l && r <= b) {
- if (l == r) {
- z[now] = value;
- }
- else {
- int mid = (l + r) / 2;
- update(z, l, mid, a, b, now * 2, value);
- update(z, mid + 1, r, a, b, now * 2 + 1, value);
- z[now] = value;
- }
- return;
- }
- if (l == r) {
- return;
- }
- int mid = (l + r) / 2;
- update(z, l, mid, a, b, now * 2, value);
- update(z, mid + 1, r, a, b, now * 2 + 1, value);
- z[now] = min(z[now * 2], z[now * 2 + 1]);
- }
- int main()
- {
- int n;
- cin >> n;
- vector<long long> a(n);
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- }
- vector<long long> z(n * 2, 1e9);
- build(z, a, 0, n - 1, 1);
- string s;
- while (cin >> s) {
- if (s == "min") {
- int l, r;
- cin >> l >> r;
- l--;
- r--;
- cout << query(z, 0, n - 1, l, r, 1) << "\n";
- }
- else if (s == "set") {
- int l, r, value;
- cin >> l >> r >> value;
- l--;
- r--;
- update(z, 0, n - 1, l, r, 1, value);
- }
- else if (s == "add") {
- int l, r, value;
- cin >> l >> r >> value;
- l--;
- r--;
- add(z, 0, n - 1, l, r, 1, value);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement