#include <bits/stdc++.h>
using namespace std;
struct Node {
  int v, s, r, f;
  int c[2];
};
Node node[200005];
int sz;
void mt(int o) { node[o].s = node[node[o].c[0]].s + node[node[o].c[1]].s + 1; }
void pd(int o) {
  if (node[o].f) {
    swap(node[o].c[0], node[o].c[1]);
    node[node[o].c[0]].f ^= 1;
    node[node[o].c[1]].f ^= 1;
    node[o].f = 0;
  }
}
void rot(int &o, int d) {
  int k = node[o].c[d ^ 1];
  node[o].c[d ^ 1] = node[k].c[d];
  node[k].c[d] = o;
  mt(o);
  mt(k);
  o = k;
}
void init(int o, int v) {
  Node &n = node[o];
  n.v = v;
  n.r = rand();
  n.s = 1;
  n.c[0] = n.c[1] = 0;
  n.f = 0;
}
void Insert(int &o, int p, int x) {
  if (o == 0) {
    o = sz++;
    init(o, x);
  } else {
    int t = node[node[o].c[0]].s + 1;
    int d = 0;
    if (p > t) {
      p -= t;
      d = 1;
    }
    Insert(node[o].c[d], p, x);
    if (node[node[o].c[d]].r > node[o].r) rot(o, d ^ 1);
  }
  mt(o);
}
void Split(int o, int &l, int &r, int k) {
  if (k == 0) {
    l = 0;
    r = o;
    return;
  }
  if (k == node[o].s) {
    l = o;
    r = 0;
    return;
  }
  pd(o);
  if (k <= node[node[o].c[0]].s) {
    pd(node[o].c[0]);
    r = o;
    Split(node[r].c[0], l, node[r].c[0], k);
    mt(r);
  } else {
    pd(node[o].c[1]);
    l = o;
    Split(node[l].c[1], node[l].c[1], r, k - node[node[o].c[0]].s - 1);
    mt(l);
  }
}
void Merge(int &o, int l, int r) {
  if (!l)
    o = r;
  else if (!r)
    o = l;
  else if (node[l].r > node[r].r) {
    o = l;
    pd(o);
    Merge(node[o].c[1], node[o].c[1], r);
    mt(o);
  } else {
    o = r;
    pd(o);
    Merge(node[o].c[0], l, node[o].c[0]);
    mt(o);
  }
}
int A[200005];
int Size = 0;
void print(int o) {
  if (o) {
    pd(o);
    print(node[o].c[0]);
    A[++Size] = node[o].v;
    print(node[o].c[1]);
  }
}
void Rev(int &o, int l, int r) {
  int lp, rp, mid;
  Split(o, lp, rp, l - 1);
  Split(rp, mid, rp, r - l + 1);
  node[mid].f ^= 1;
  Merge(o, lp, mid);
  Merge(o, o, rp);
}
void CRshift(int &o, int l, int r) {
  int lp, rp, mid, MID;
  Split(o, lp, rp, l - 1);
  Split(rp, mid, rp, r - l + 1);
  Split(mid, MID, mid, r - l);
  Merge(mid, mid, MID);
  Merge(o, lp, mid);
  Merge(o, o, rp);
}
int main() {
  node[0].s = 0;
  sz = 1;
  int root = 0;
  int n, q, m, p;
  scanf("%d %d %d", &n, &q, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &p);
    Insert(root, i, p);
  }
  while (q--) {
    int cmd, l, r;
    scanf("%d %d %d", &cmd, &l, &r);
    if (cmd == 1)
      CRshift(root, l, r);
    else
      Rev(root, l, r);
  }
  print(root);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &p);
    printf("%d ", A[p]);
  }
  return 0;
}
