#include <bits/stdc++.h>
using namespace std;
const int N = 1234567;
int a[N];
int p[N];
struct node {
  int x, y;
  int size;
  bool rev;
  node *l, *r;
  node(int x, int y) : x(x), y(y), l(NULL), r(NULL), size(0), rev(false) {}
};
int size(node* it) { return it ? it->size : 0; }
void update(node* it) {
  if (it) {
    it->size = 1 + size(it->l) + size(it->r);
  }
}
void push(node* it) {
  if (it && it->rev) {
    it->rev = false;
    swap(it->l, it->r);
    if (it->l) it->l->rev ^= true;
    if (it->r) it->r->rev ^= true;
  }
}
void split(node* tree, node*& l, node*& r, int k, int add = 0) {
  if (!tree) {
    l = r = NULL;
    return;
  }
  push(tree);
  int ikey = size(tree->l) + add;
  if (ikey < k) {
    split(tree->r, tree->r, r, k, add + size(tree->l) + 1);
    l = tree;
  } else {
    split(tree->l, l, tree->l, k, add);
    r = tree;
  }
  update(tree);
}
void merge(node*& tree, node* l, node* r) {
  push(l);
  push(r);
  if (!l || !r) {
    tree = l ? l : r;
  } else if (l->y > r->y) {
    merge(l->r, l->r, r);
    tree = l;
  } else {
    merge(r->l, l, r->l);
    tree = r;
  }
  update(tree);
}
void insert(node*& tree, node* it, int pos) {
  node *l, *r;
  split(tree, l, r, pos);
  merge(l, l, it);
  merge(tree, l, r);
}
void inorder(node* tree) {
  push(tree);
  if (!tree) return;
  inorder(tree->l);
  fprintf(stderr, "%d ", tree->x);
  inorder(tree->r);
}
void shift(node* tree, int l, int r) {
  node *t1, *t2, *t3, *it;
  split(tree, t1, t2, l);
  split(t2, t2, t3, r - l + 1);
  split(t2, t2, it, r - l);
  merge(t2, it, t2);
  merge(tree, t1, t2);
  merge(tree, tree, t3);
}
void reverse(node* tree, int l, int r) {
  node *t1, *t2, *t3;
  split(tree, t1, t2, l);
  split(t2, t2, t3, r - l + 1);
  t2->rev ^= true;
  merge(tree, t1, t2);
  merge(tree, tree, t3);
}
int get(node* tree, int pos) {
  node *t1, *t2, *t3;
  split(tree, t1, t2, pos);
  split(t2, t2, t3, 1);
  int ret = t2->x;
  merge(tree, t1, t2);
  merge(tree, tree, t3);
  return ret;
}
int main() {
  int n, q, m;
  scanf("%d %d %d", &n, &q, &m);
  for (int i = 0; i < n; i++) {
    p[i] = i;
  }
  srand(time(0));
  for (int i = n - 1; i > 0; i--) {
    int j = rand() % i;
    swap(p[i], p[j]);
  }
  node* treap = NULL;
  for (int i = 0; i < n; i++) {
    scanf("%d", a + i);
    node* it = new node(a[i], p[i]);
    insert(treap, it, i);
  }
  while (q--) {
    int t, l, r;
    scanf("%d %d %d", &t, &l, &r);
    l--, r--;
    if (t == 1) {
      shift(treap, l, r);
    } else if (t == 2) {
      reverse(treap, l, r);
    } else
      assert(0);
  }
  for (int i = 0; i < m; i++) {
    if (i > 0) putchar(' ');
    int x;
    scanf("%d", &x);
    x--;
    int ans = get(treap, x);
    printf("%d", ans);
  }
  puts("");
  return 0;
}
