0

Its a hackerRank question which has a predefined input stub and we have to fill in the processing function. My code gives a SIGSEV error and I don't understand why.

I checked multiple times, and I have a very definite way of doing the complete program myself.

The problem statement is in the link given - Dynamic Array, Hackerrank

#include <bits/stdc++.h>

using namespace std;

string ltrim(const string &);
string rtrim(const string &);
vector<string> split(const string &);

/*
 * Complete the 'dynamicArray' function below.
 *
 * The function is expected to return an INTEGER_ARRAY.
 * The function accepts following parameters:
 *  1. INTEGER n
 *  2. 2D_INTEGER_ARRAY queries
 */
//function defined by me
vector<int> dynamicArray(int n, vector<vector<int>> queries, int q) {

    vector<vector<int>> a;
    int lastAnswer=0, i = 0;
    vector<int> ret;

    while(i<q)
    {
        if(queries[i][0]==1)
        {
            a[(queries[i][1]^lastAnswer)%n].push_back(queries[i][2]);
        }

        else if(queries[i][0]==2)
        {
            lastAnswer=a[(queries[i][1]^lastAnswer)%n][queries[i][2]];
            ret.push_back(lastAnswer);
        }

        i++;
    }

    return ret;
}

int main()
{
    ofstream fout(getenv("OUTPUT_PATH"));

    string first_multiple_input_temp;
    getline(cin, first_multiple_input_temp);

    vector<string> first_multiple_input = split(rtrim(first_multiple_input_temp));

    int n = stoi(first_multiple_input[0]);

    int q = stoi(first_multiple_input[1]);

    vector<vector<int>> queries(q);

    for (int i = 0; i < q; i++) {
        queries[i].resize(3);

        string queries_row_temp_temp;
        getline(cin, queries_row_temp_temp);

        vector<string> queries_row_temp = split(rtrim(queries_row_temp_temp));

        for (int j = 0; j < 3; j++) {
            int queries_row_item = stoi(queries_row_temp[j]);

            queries[i][j] = queries_row_item;
        }
    }

    vector<int> result = dynamicArray(n, queries, q);

    for (int i = 0; i < result.size(); i++) {
        fout << result[i];

        if (i != result.size() - 1) {
            fout << "\n";
        }
    }

    fout << "\n";

    fout.close();

    return 0;
}

string ltrim(const string &str) {
    string s(str);

    s.erase(
        s.begin(),
        find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace)))
    );

    return s;
}

string rtrim(const string &str) {
    string s(str);

    s.erase(
        find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(),
        s.end()
    );

    return s;
}

vector<string> split(const string &str) {
    vector<string> tokens;

    string::size_type start = 0;
    string::size_type end = 0;

    while ((end = str.find(" ", start)) != string::npos) {
        tokens.push_back(str.substr(start, end - start));

        start = end + 1;
    }

    tokens.push_back(str.substr(start));

    return tokens;
}
2

1 Answer 1

1

You are getting a segfault (SIGSEGV) because you create an empty vector here:

vector<vector<int>> a;

Then try to access it here:

a[(queries[i][1]^lastAnswer)%n].push_back(queries[i][2]);

Resulting in Undefined Behaviour. When undefined behaviour happens in a program, anything can happen, however in this case you get a segmentation fault. A segmentation fault means you tried to access memory that you are not allowed to. If you were using windows, you would probably get a different sort of error.

To fix this, simply create the vector with a predetermined size:

vector<vector<int>> a(n); //n is the size of the vector here
Sign up to request clarification or add additional context in comments.

2 Comments

in the code it looks more like the maximum index would be n not q
Ah, Yes, indeed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.