Submission #1075850

#TimeUsernameProblemLanguageResultExecution timeMemory
1075850horiaboeriuSimple (info1cup19_simple)C++17
100 / 100
273 ms40028 KiB
#include <stdio.h>
#include <stdlib.h>
#define MAX 200000
#define INFINIT 1000000000000000000
long long a[4 * MAX + 1], a1[4 * MAX + 1], b[4 * MAX + 1], b1[4 * MAX + 1], v[4 * MAX + 1];
char flag[4 * MAX + 1];
long long min, max;
//in a este min par
//in a1 este min impar
//in b este max par
//in b1 este max impar
//pun INFINIT sau -INFINIT daca nu exista par sau impar in acel interval
long long minim(long long x, long long y)  {
    return x < y ? x : y;
}
long long maxim(long long x, long long y) {
    return x > y ? x : y;
}
void calcul(int nod) {
    a[nod] = minim(a[2 * nod], a[2 * nod + 1]);
    a1[nod] = minim(a1[2 * nod], a1[2 * nod + 1]);

    b[nod] = maxim(b[2 * nod], b[2 * nod + 1]);
    b1[nod] = maxim(b1[2 * nod], b1[2 * nod + 1]);
}
void build(int nod, int st, int dr) {
    int mid, x;
    if (st == dr) {
        scanf("%d", &x);
        if (x % 2 == 0) {
            a[nod] = b[nod] = x;
            a1[nod] = INFINIT;
            b1[nod] = -INFINIT;
        } else {
            a1[nod] = b1[nod] = x;
            a[nod] = INFINIT;
            b[nod] = -INFINIT;
        }
    } else {
        mid = (st + dr) / 2;
        build(2 * nod, st, mid);
        build(2 * nod + 1, mid + 1, dr);
        calcul(nod);
    }
}
void prop(int nod, long long val) {
    long long aux;
    //fac acelasi lucru pentru a si b
    //adun val la ambele din a si voi actualiza minimul par si impar
    if (a[nod] == INFINIT) {
        if (val % 2 == 0) {
            a1[nod] += val;
        } else {
            a[nod] = a1[nod] + val;
            a1[nod] = INFINIT;
        }
    } else if (a1[nod] == INFINIT) {
        if (val % 2 == 0) {
            a[nod] += val;
        } else {
            a1[nod] = a[nod] + val;
            a[nod] = INFINIT;
        }
    } else {
        if (val % 2 == 0) {
            a[nod] += val;
            a1[nod] += val;
        } else {
            aux = a[nod];
            a[nod] = a1[nod] + val;
            a1[nod] = aux + val;
        }
    }

    if (b[nod] == -INFINIT) {
        if (val % 2 == 0) {
            b1[nod] += val;
        } else {
            b[nod] = b1[nod] + val;
            b1[nod] = -INFINIT;
        }
    } else if (b1[nod] == -INFINIT) {
        if (val % 2 == 0) {
            b[nod] += val;
        } else {
            b1[nod] = b[nod] + val;
            b[nod] = -INFINIT;
        }
    } else {
        if (val % 2 == 0) {
            b[nod] += val;
            b1[nod] += val;
        } else {
            aux = b[nod];
            b[nod] = b1[nod] + val;
            b1[nod] = aux + val;
        }
    }
}
void query(int nod, int st, int dr, int x, int y) {
    int mid;
    if (x <= st && y >= dr) {
        min = minim(min, a[nod]);
        max = maxim(max, b1[nod]);
    } else {
        mid = (st + dr) / 2;
        if (flag[nod] == 1) {//propag in jos cat am de adunat
            prop(2 * nod, v[nod]);
            prop(2 * nod + 1, v[nod]);

            flag[2 * nod] = flag[2 * nod + 1] = 1;
            v[2 * nod] += v[nod];
            v[2 * nod + 1] += v[nod];
            flag[nod] = v[nod] = 0;
        }
        if (x <= mid) {
            query(2 * nod, st, mid, x, y);
        }
        if (y > mid) {
            query(2 * nod + 1, mid + 1, dr, x, y);
        }
        calcul(nod);
    }
}
void update(int nod, int st, int dr, int x, int y, int val) {
    int mid;
    if (x <= st && y >= dr) {
        prop(nod, (long long)val);
        flag[nod] = 1;
        v[nod] += val;
    } else {
        mid = (st + dr) / 2;
        if (flag[nod] == 1) {//propag in jos cat am de adunat
            prop(2 * nod, v[nod]);
            prop(2 * nod + 1, v[nod]);

            flag[2 * nod] = flag[2 * nod + 1] = 1;
            v[2 * nod] += v[nod];
            v[2 * nod + 1] += v[nod];
            flag[nod] = v[nod] = 0;
        }
        if (x <= mid) {
            update(2 * nod, st, mid, x, y, val);
        }
        if (y > mid) {
            update(2 * nod + 1, mid + 1, dr, x, y, val);
        }
        calcul(nod);
    }
}
int main()
{
    int n, q, i, x, y, nr, cer;
    scanf("%d", &n);
    build(1, 1, n);
    scanf("%d", &q);
    for (i = 0; i < q; i++) {
        scanf("%d", &cer);
        if (cer == 0) {
            scanf("%d%d%d", &x, &y, &nr);
            update(1, 1, n, x, y, nr);
        } else {
            scanf("%d%d", &x, &y);
            min = INFINIT;
            max = -INFINIT;
            query(1, 1, n, x, y);
            if (min == INFINIT) {
                min = -1;
            }
            if (max == -INFINIT) {
                max = -1;
            }
            printf("%lld %lld\n", min, max);
        }
    }
    return 0;
}

Compilation message (stderr)

subway.cpp: In function 'void build(int, int, int)':
subway.cpp:29:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   29 |         scanf("%d", &x);
      |         ~~~~~^~~~~~~~~~
subway.cpp: In function 'int main()':
subway.cpp:154:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  154 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
subway.cpp:156:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  156 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
subway.cpp:158:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  158 |         scanf("%d", &cer);
      |         ~~~~~^~~~~~~~~~~~
subway.cpp:160:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  160 |             scanf("%d%d%d", &x, &y, &nr);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
subway.cpp:163:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  163 |             scanf("%d%d", &x, &y);
      |             ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...