#include <bits/stdc++.h>
#pragma GCC optimize "03"
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rand(int l, int r) {
  uniform_int_distribution<int> uid(l, r);
  return uid(rng);
}
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
const int inf = 1e9 + 9;
struct node {
  int prior, cnt, val;
  bool rev;
  node *l, *r;
  node() {}
  node(int prior, int val)
      : prior(prior), l(NULL), r(NULL), cnt(0), val(val), rev(0) {}
};
typedef node *pnode;
int cnt(pnode t) { return t ? t->cnt : 0; }
void upd_cnt(pnode t) {
  if (t) t->cnt = 1 + cnt(t->l) + cnt(t->r);
}
void push(pnode t) {
  if (t && t->rev) {
    t->rev = 0;
    swap(t->l, t->r);
    if (t->l) t->l->rev ^= 1;
    if (t->r) t->r->rev ^= 1;
  }
}
void split(pnode t, int key, pnode &l, pnode &r, int add = 0) {
  if (!t) return void(l = r = NULL);
  push(t);
  int cur_key = add + cnt(t->l);
  if (key <= cur_key)
    split(t->l, key, l, t->l, add), r = t;
  else
    split(t->r, key, t->r, r, add + 1 + cnt(t->l)), l = t;
  upd_cnt(t);
}
void merge(pnode &t, pnode l, pnode r) {
  push(l);
  push(r);
  if (!l || !r)
    t = l ? l : r;
  else if (l->prior < r->prior)
    merge(l->r, l->r, r), t = l;
  else
    merge(r->l, l, r->l), t = r;
  upd_cnt(t);
}
void query1(pnode &t, int l, int r) {
  pnode t1, t2, t3, t4;
  split(t, l - 1, t1, t2);
  split(t2, r - l, t2, t3);
  split(t3, 1, t3, t4);
  merge(t, t1, t3);
  merge(t, t, t2);
  merge(t, t, t4);
}
void query2(pnode &t, int l, int r) {
  pnode t1, t2, t3;
  split(t, l - 1, t1, t2);
  split(t2, r - l + 1, t2, t3);
  t2->rev ^= 1;
  merge(t, t1, t2);
  merge(t, t, t3);
}
int print(pnode t, int k) {
  push(t);
  if (!(t->l)) {
    if (k == 1)
      return t->val;
    else
      return print(t->r, k - 1);
  } else {
    if (k <= t->l->cnt)
      return print(t->l, k);
    else if (k == (t->l->cnt + 1))
      return t->val;
    else
      return print(t->r, k - (t->l->cnt) - 1);
  }
}
int a[N];
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  pnode t = NULL;
  int n, q, m;
  cin >> n >> q >> m;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    pnode temp = new node(rand(1, 2e9), i);
    merge(t, t, temp);
  }
  while (q--) {
    int type, x, y;
    cin >> type >> x >> y;
    if (type == 1)
      query1(t, x, y);
    else
      query2(t, x, y);
  }
  while (m--) {
    int x;
    cin >> x;
    cout << a[print(t, x)] << " ";
  }
  return 0;
}
