Submission #230369

#TimeUsernameProblemLanguageResultExecution timeMemory
230369AlexandruabcdeSimple (info1cup19_simple)C++14
100 / 100
436 ms31096 KiB
#include <iostream>
#define INF 1000000000000000

using namespace std;

constexpr int NMAX = 200005;

struct arbore
{
    long long MinPar, MinImpar, MaxPar, MaxImpar;
};

arbore arb[4*NMAX];
long long lazy[4*NMAX];

int N;

void upgradez (int nod, long long val)
{
    lazy[nod] += val;

    if (arb[nod].MinPar != INF)
        arb[nod].MinPar += val;
    if (arb[nod].MinImpar != INF)
        arb[nod].MinImpar += val;
    if (arb[nod].MaxPar != -INF)
        arb[nod].MaxPar += val;
    if (arb[nod].MaxImpar != -INF)
        arb[nod].MaxImpar += val;

    if (val % 2 == 1)
    {
        swap(arb[nod].MinPar, arb[nod].MinImpar);

        swap(arb[nod].MaxPar, arb[nod].MaxImpar);
    }
}

void Propag (int nod, int a, int b)
{
    if (a == b || lazy[nod] == 0) return;

    lazy[2*nod] += lazy[nod];
    lazy[2*nod+1] += lazy[nod];

    if (arb[2*nod].MinPar != INF)
        arb[2*nod].MinPar += lazy[nod];
    if (arb[2*nod+1].MinPar != INF)
        arb[2*nod+1].MinPar += lazy[nod];

    if (arb[2*nod].MaxPar != -INF)
        arb[2*nod].MaxPar += lazy[nod];
    if (arb[2*nod+1].MaxPar != -INF)
        arb[2*nod+1].MaxPar += lazy[nod];

    if (arb[2*nod].MinImpar != INF)
        arb[2*nod].MinImpar += lazy[nod];
    if (arb[2*nod+1].MinImpar != INF)
        arb[2*nod+1].MinImpar += lazy[nod];

    if (arb[2*nod].MaxImpar != -INF)
        arb[2*nod].MaxImpar += lazy[nod];
    if (arb[2*nod+1].MaxImpar != -INF)
        arb[2*nod+1].MaxImpar += lazy[nod];

    if (lazy[nod] % 2 == 1)
    {
        swap(arb[2*nod].MaxPar, arb[2*nod].MaxImpar);
        swap(arb[2*nod].MinPar, arb[2*nod].MinImpar);
        swap(arb[2*nod+1].MaxPar, arb[2*nod+1].MaxImpar);
        swap(arb[2*nod+1].MinPar, arb[2*nod+1].MinImpar);
    }

    lazy[nod] = 0;
}

void Update_Lazy (int nod, int a, int b, int ua, int ub, long long val)
{
    if (ua <= a && b <= ub)
    {
        upgradez(nod, val);

        return;
    }

    Propag(nod, a, b);

    int mij = (a + b) / 2;

    if (ua <= mij) Update_Lazy(2*nod, a, mij, ua, ub, val);
    if (mij < ub) Update_Lazy(2*nod+1, mij+1, b, ua, ub, val);

    arb[nod].MaxPar = max(arb[2*nod].MaxPar, arb[2*nod+1].MaxPar);
    arb[nod].MaxImpar = max(arb[2*nod].MaxImpar, arb[2*nod+1].MaxImpar);
    arb[nod].MinPar = min(arb[2*nod].MinPar, arb[2*nod+1].MinPar);
    arb[nod].MinImpar = min(arb[2*nod].MinImpar, arb[2*nod+1].MinImpar);
}

void Update_Single (int nod, int a, int b, int poz, long long val)
{
    if (a == b)
    {
        if (val % 2 == 0)
        {
            arb[nod].MaxPar = arb[nod].MinPar = val;
            arb[nod].MinImpar = INF;
            arb[nod].MaxImpar = -INF;
        }
        else
        {
            arb[nod].MaxImpar = arb[nod].MinImpar = val;
            arb[nod].MinPar = INF;
            arb[nod].MaxPar = -INF;
        }

        return;
    }

    int mij = (a + b) / 2;

    if (poz <= mij) Update_Single(2*nod, a, mij, poz, val);
    else Update_Single(2*nod+1, mij+1, b, poz, val);

    arb[nod].MaxPar = max(arb[2*nod].MaxPar, arb[2*nod+1].MaxPar);
    arb[nod].MaxImpar = max(arb[2*nod].MaxImpar, arb[2*nod+1].MaxImpar);
    arb[nod].MinPar = min(arb[2*nod].MinPar, arb[2*nod+1].MinPar);
    arb[nod].MinImpar = min(arb[2*nod].MinImpar, arb[2*nod+1].MinImpar);
}

pair <long long, long long> Query (int nod, int a, int b, int qa, int qb)
{
    if (qa <= a && b <= qb)
    {
        return {arb[nod].MinPar, arb[nod].MaxImpar};
    }

    Propag(nod, a, b);

    int mij = (a + b) / 2;
    pair <long long, long long> ans_1 = {INF, -INF}, ans_2 = {INF, -INF};

    if (qa <= mij) ans_1 = Query(2*nod, a, mij, qa, qb);
    if (mij < qb) ans_2 = Query(2*nod+1, mij+1, b, qa, qb);

    return {min(ans_1.first, ans_2.first), max(ans_1.second, ans_2.second)};
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int Q;

    cin >> N;

    for (int i = 1; i <= N; ++i)
    {
        long long x;

        cin >> x;

        Update_Single(1, 1, N, i, x);
    }

    cin >> Q;

    for (; Q; --Q)
    {
        int type;

        cin >> type;

        if (type == 0)
        {
            int a, b;
            long long val;

            cin >> a >> b >> val;

            Update_Lazy(1, 1, N, a, b, val);
        }
        else
        {
            int a, b;

            cin >> a >> b;

            pair <long long, long long> x = Query(1, 1, N, a, b);

            if (x.first == INF) x.first = -1;
            if (x.second == -INF) x.second = -1;

            cout << x.first << " " << x.second << '\n';
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...