Submission #1070538

#TimeUsernameProblemLanguageResultExecution timeMemory
1070538horiaboeriuXORanges (eJOI19_xoranges)C++17
100 / 100
115 ms8016 KiB
#include <bits/stdc++.h>

using namespace std;
#define MAXN 200000
int v[MAXN + 1], aibi[MAXN / 2 + 1], aibp[MAXN / 2 + 1];//aib pentru xor
void addBit(int poz, int n, int val, int aib[]) {
    while (poz <= n) {
        aib[poz] ^= val;
        poz += (poz & (-poz));
    }
}
int bitXor(int poz, int aib[]) {
    int s;
    s = 0;
    while (poz > 0) {
        s ^= aib[poz];
        poz &= (poz - 1);
    }
    return s;
}
int main()
{
    //in intervalul de la st la dr, fiecarui numar i se va face xor de (cate nr are in stanga + 1) * (cate nr are in dreapta + 1)
    //ca un interval care il contine poate incepe la orice pozitie <= cu el si la oricare >= cu el
    //daca in interval sunt x numere si x este par, atunci
    //primul numar apare de 1 * x, al doilea de 2 * (x - 1), urmatoarele de
    //3 * (x - 2), 4 * (x - 3), 5 * (x - 4)... si din cei doi termeni care se inmultesc, unul sigur este par ca trebuie sa aiba suma x + 1, deci unul e par si altul imapr
    //deci fiecare numar apare de un numar par de ori deci xorul intervalului va fi 0 ca se elimina fiecare

    //daca x este impar, atunci, cei doi termeni inmultiti vor avea suma x + 1 care este para
    //cei de pe poz impare vor avea nr in stanga + 1 = impar, nr in dreapta + 1 = impar, deci fac xorul de pe poz impare, daca prima poz este st
    //fac cu aib in loc de aint
    int n, q, i, nri, nrp, cer, p, x, st, dr;
    scanf("%d%d", &n, &q);
    nri = (n + 1) / 2;
    nrp = n / 2;
    for (i = 1; i <= n; i++) {
        scanf("%d", &v[i]);
        if (i % 2 == 0) {
            addBit(i / 2, nrp, v[i], aibp);
        } else {
            addBit(i / 2 + 1, nri, v[i], aibi);
        }
    }
    for (i = 0; i < q; i++) {
        scanf("%d", &cer);
        if (cer == 1) {
            scanf("%d%d", &p, &x);
            //voi actualiza cu xorul dintre x si v[p] ca toate v[p] sa se transforme in x
            if (p % 2 == 0) {
                addBit(p / 2, nrp, x ^ v[p], aibp);
            } else {
                addBit(p / 2 + 1, nri, x ^ v[p], aibi);
            }
            v[p] = x;
        } else {
            scanf("%d%d", &st, &dr);
            if ((dr - st + 1) % 2 == 0) {
                printf("0\n");
            } else {
                if (st % 2 > 0) {
                    printf("%d\n", bitXor(st / 2, aibi) ^ bitXor(dr / 2 + 1, aibi));
                } else {
                    printf("%d\n", bitXor((st - 2) / 2, aibp) ^ bitXor(dr / 2, aibp));
                }
            }
        }
    }
    return 0;
}

Compilation message (stderr)

xoranges.cpp: In function 'int main()':
xoranges.cpp:34:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |     scanf("%d%d", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~
xoranges.cpp:38:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |         scanf("%d", &v[i]);
      |         ~~~~~^~~~~~~~~~~~~
xoranges.cpp:46:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   46 |         scanf("%d", &cer);
      |         ~~~~~^~~~~~~~~~~~
xoranges.cpp:48:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |             scanf("%d%d", &p, &x);
      |             ~~~~~^~~~~~~~~~~~~~~~
xoranges.cpp:57:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |             scanf("%d%d", &st, &dr);
      |             ~~~~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...