Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define re return
- #define pb push_back
- #define po pop_back
- #define all(x) (x).begin(), (x).end()
- #define fi first
- #define se second
- #define sqrt(x) sqrt(abs(x))
- #define mp make_pair
- #define pi 3.14159265359
- #define fo(i, n) for(int i = 0; i < n; ++i)
- #define ro(i, n) for(int i = n - 1; i >= 0; --i)
- #define fill(x, y) memset(x, y, sizeof(x))
- typedef vector<int> vi;
- typedef vector<vi> vvi;
- typedef pair<int, int> ii;
- typedef vector<ii> vii;
- typedef vector<string> vs;
- typedef double D;
- typedef long double ld;
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef vector<ll> vll;
- const int maxn = 2 * ((int) 1e5);
- ll a[maxn];
- ll b[maxn];
- ll now[maxn];
- int n;
- int len;
- inline ll get_min(int l, int r) {
- ll ans = (ll) 1e18;
- --ans;
- int cl = l / len, cr = r / len;
- if (cl == cr) {
- for(int i = l; i <= r; ++i) ans = min(ans, a[i] + now[i / len]);
- } else {
- int end = (cl + 1) * len;
- for(int i = l; i < end; ++i) ans = min(ans, a[i] + now[i / len]);
- for(int i = cl + 1; i < cr; ++i) ans = min(ans, b[i]);
- for(int i = cr * len; i <= r; ++i) ans = min(ans, a[i] + now[i / len]);
- }
- re ans;
- }
- inline void update(int l, int r, int p) {
- int cl = l / len, cr = r / len;
- if (cl == cr) {
- for(int i = l; i <= r; ++i) a[i] += p;
- } else {
- int end = (cl + 1) * len;
- for(int i = l; i < end; ++i) a[i] += p;
- for(int i = cl + 1; i < cr; ++i) {
- b[i] += p;
- now[i] += p;
- }
- for(int i = cr * len; i <= r; ++i) a[i] += p;
- }
- ///
- {
- int j = (l / len) * len;
- b[j / len] = (ll) 1e18;
- --b[j / len];
- for(int i = j; i < j + len && i < n; ++i) b[i / len] = min(b[i / len], a[i] + now[i / len]);
- }
- {
- int j = (r / len) * len;
- b[j / len] = (ll) 1e18;
- --b[j / len];
- for(int i = j; i < n && i < j + len; ++i) b[i / len] = min(b[i / len], a[i] + now[i / len]);
- }
- }
- int main() {
- scanf("%d", &n);
- fo(i, n) {
- int x;
- scanf("%d", &x);
- a[i] = x;
- b[i] = (ll) 1e18;
- --b[i];
- }
- len = (int)(sqrt(n)) + 1;
- for(int i = 0; i < n; i += len) {
- for(int j = i; j < n && j < i + len; ++j) {
- b[i / len] = min(b[i / len], a[j]);
- }
- }
- int m;
- scanf("%d\n", &m);
- char c[100];
- fo(i, m) {
- gets(c);
- int q = 0;
- int l = 0, r = 0, p = 0;
- for (int i = 0; c[i] != '\n' && c[i] != '\0'; ++i) {
- if (!isdigit(c[i]) && c[i] != '-') continue;
- string str;
- while(isdigit(c[i]) || c[i] == '-') str += c[i++];
- //cout << "!!" << str << ' ' << i << endl;
- switch (q) {
- case 0:
- l = atoi(str.c_str());
- break;
- case 1:
- r = atoi(str.c_str());
- break;
- case 2:
- p = atoi(str.c_str());
- break;
- }
- --i;
- ++q;
- }
- if (q == 2) {
- ll ans = (ll) 1e18;
- --ans;
- if (l > r) {
- ans = min (ans, get_min(0, r));
- ans = min (ans, get_min(l, n - 1));
- }
- else ans = get_min(l, r);
- printf ("%I64d\n", ans);
- }
- else {
- if (l > r) {
- update(0, r, p);
- update(l, n - 1, p);
- }
- else update(l, r, p);
- }
- }
- re 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement