주어진 배열의 크기는 [10000] / 배열 전체 0으로 초기화 / 배열 내 0은 원소가 아니다 

명령어는 다음과 같이 총 3가지이다.

at(i): 배열의 인덱스 i에 저장된 양의 정수를 출력. 만약 원소가 없는 인덱스 i값이 주어지면 0을 출력


set(i, X): 배열의 인덱스 i에 저장된 양의 정수를 X값으로 덮어 씌운다. 만약 원소가 없는 인덱스 i값이 주어지면 0을 출력

add(i, X): 배열의 인덱스 i보다 크거나 같은 곳에 저장된 값을 +1 칸 씩 이동 시키고 인덱스 i에 양의 정수 X 를 삽입. 만약 원소가 없는 인덱스 i값이 주어지면 마지막 원소가 있는 바로 다음 인덱스에 양의 정수 X를 삽입 (원소가 없을 경우 첫 번째 인덱스에 삽입)

입력 : 첫 번째 줄에 명령어의 수 M (1 ≤ M ≤ 10,000)이 주어진다. 두 번째 줄부터 M개의 줄에는 명령어가 하나 씩 주어진다 (1 ≤ X ≤ 10,000) (0≤ i < 10,000) (배열 사이즈 N=10,000). 출력 출력해야 하는 명령어가 주어질 때마다 그 결과를 한 줄 씩 출력한다.

#include<string>

#include <iostream>

using namespace std;


class Array {

private:

int* arr; //배열

int arrSize; //배열의 크기


public:

Array(int size) { //Array 생성자

this->arrSize = size;  

this->arr = new int[arrSize]; 

for (int i = 0; i < size; i++) { //각 인덱스 원소들 0으로 초기화

arr[i] = 0;

}

}


int at(int idx) {  //idx위치에 있는 원소 리턴

if (arr[idx] == 0) {//if 문 자리에 0 대신 NULL 을 넣어도 안 된다. 미치겠네.

return 0;

}

return arr[idx];

}


void add(int idx, int value) { //idx위치에 value값 삽입

if (arr[idx] == 0){//if 문 자리에 0 대신 NULL 을 넣어도 안 된다.


while (true) {


if (arr[idx - 1] != 0) {

arr[idx] = value;

break;

}


--idx;


}

}

else{

for (int i = arrSize - 2; i >= idx; i--) { //맨 뒤에서 2번째 원소부터 idx번째

arr[i + 1] = arr[i];                   //원소까지 왼쪽으로 한칸씩 이동

}

arr[idx] = value;    //idx번째 원소에 값 넣기

}

}

void set(int idx, int value) {//인덱스가 idx인 원소를 value로 대체


if (arr[idx] != 0) {//여기도 마찬가지.

arr[idx] = value;

}


else {

arr[idx] = value;

cout << "0" << endl;

}

}




};



int main() {


int a = 0;

int b = 0;

int M = 0;

string enter;


cin >> M;

Array one(10000);



for (int i = 0; i < M; i++) {

cin >> enter;


if (enter == "at") {

cin >> a;

cout << one.at(a) << endl;

}


if (enter == "set") {

cin >> a;

cin >> b;

one.set(a,b);



}

if (enter == "add") {

cin >> a;

cin >> b;

one.add(a, b);



}

}

}