#include <bits/stdc++.h>
using namespace ::std;
const int N = 200000 + 5;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int random(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); }
struct node {
  int val;
  bool rev;
  int cnt;
  int priority;
  node* left;
  node* right;
  node(int val) : val(val) {
    priority = random(0, 100);
    left = right = nullptr;
    rev = false;
    cnt = 1;
  }
};
int n;
int q;
int m;
int a[N];
node* T = nullptr;
int cnt(node* t) { return t ? t->cnt : 0; }
void push(node* t) {
  if (t and t->rev) {
    swap(t->left, t->right);
    if (t->left) t->left->rev ^= true;
    if (t->right) t->right->rev ^= true;
    t->rev = false;
  }
}
void update(node* t) {
  if (t) t->cnt = cnt(t->left) + 1 + cnt(t->right);
}
node* merge(node* l, node* r) {
  push(l);
  push(r);
  if (l == nullptr) return r;
  if (r == nullptr) return l;
  if (l->priority > r->priority) {
    l->right = merge(l->right, r);
    update(l);
    return l;
  } else {
    r->left = merge(l, r->left);
    update(r);
    return r;
  }
}
pair<node*, node*> split(node* t, int x, int add = 0) {
  if (t == nullptr) {
    return {nullptr, nullptr};
  }
  push(t);
  int key = add + cnt(t->left) + 1;
  if (key <= x) {
    pair<node*, node*> p = split(t->right, x, key);
    t->right = p.first;
    update(t);
    return {t, p.second};
  } else {
    pair<node*, node*> p = split(t->left, x, add);
    t->left = p.second;
    update(t);
    return {p.first, t};
  }
}
node* insert(node* T, int val) {
  T = merge(T, new node(val));
  return T;
}
node* shift(node* T, int l, int r) {
  pair<node*, node*> p1 = split(T, r);
  pair<node*, node*> p2 = split(p1.first, r - 1);
  pair<node*, node*> p3 = split(p2.first, l - 1);
  T = merge(p3.first, p2.second);
  T = merge(T, p3.second);
  T = merge(T, p1.second);
  return T;
}
node* reverse(node* T, int l, int r) {
  pair<node*, node*> p1 = split(T, r);
  pair<node*, node*> p2 = split(p1.first, l - 1);
  if (p2.second) p2.second->rev ^= true;
  T = merge(p2.first, p2.second);
  T = merge(T, p1.second);
  return T;
}
void DFS(node* T, int add = 0) {
  if (T == nullptr) return;
  push(T);
  DFS(T->left, add);
  int key = add + cnt(T->left) + 1;
  a[key] = T->val;
  DFS(T->right, key);
}
int main() {
  scanf("%d %d %d", &n, &q, &m);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    T = insert(T, x);
  }
  int op, l, r;
  while (q--) {
    scanf("%d %d %d", &op, &l, &r);
    if (op == 1) {
      if (l < r) T = shift(T, l, r);
    } else {
      if (l < r) T = reverse(T, l, r);
    }
  }
  DFS(T);
  for (int i = 1; i <= m; i++) {
    int x;
    scanf("%d", &x);
    printf("%d%c", a[x], " \n"[i == m]);
  }
  return 0;
}
