Official

D - Append Editorial by kyopro_friends


この問題は配列(リスト)を適切に使うことで答えを求めることができます。

以下には Python, C++, C での実装例を載せます。他の言語のほとんどはこれらのいずれかと同様に実装することができます。

Python では、リスト \(A\) の末尾に要素 \(x\) を追加することは A.append(x) ででき、リスト \(A\) の末尾から \(x\) 番目の要素の値を得ることは A[-x] によりできます。

Q=int(input())
A=[]
for _ in range(Q):
  t,x=map(int,input().split())
  if t==1:
    A.append(x)
  else:
    print(A[-x])

C++では、vector \(A\) の末尾に要素 \(x\) を追加することは A.push_back(x) ででき、vector \(A\) の末尾から \(x\) 番目の要素の値を得ることは A[A.size()-x] によりできます。

#include<bits/stdc++.h>
using namespace std;
int main(){
  int Q;
  cin >> Q;
  vector<int>A;
  for(int i=0;i<Q;i++){
    int t,x;
    cin >> t >> x;
    if(t==1){
      A.push_back(x);
    }else{
      cout << A[A.size()-x] << endl;
    }
  }
}

C では、C++ の vector のようなものはないので、ありえる要素数の最大値 (この問題では\(Q\) の最大値である \(100\)) より長い固定長配列を最初から確保しておき、要素数は自分で管理するのが実装が最も単純でしょう。

#include<stdio.h>
int main(){
  int Q;
  scanf("%d",&Q);
  int A[101];
  int size=0;
  for(int i=0;i<Q;i++){
    int t,x;
    scanf("%d%d",&t,&x);
    if(t==1){
      A[size]=x;
      size++;
    }else{
      printf("%d\n",A[size-x]);
    }
  }
}

posted:
last update: