#include #include #include #include #include #include #include #include #include #include #include typedef long long llong; const int MAXN = 100000 + 10; const int INTINF = 1e9; const llong INF = 4e18; const int MAXLOG = 17; int n, q; std::mt19937_64 rng(std::chrono::steady_clock().now().time_since_epoch().count()); struct Treap { struct Node { llong x; llong y; llong pos; std::pair min; std::pair max; std::pair minDiff; Node *left, *right; Node() { left = right = nullptr; } Node(llong _x, llong _pos, llong _y) { x = _x; y = _y; pos = _pos; min = max = {x, pos}; minDiff = {INF, INF}; left = right = nullptr; } }; Node *treap; void recover(Node *curr) { if (curr == nullptr) { return; } curr->max = {curr->x, curr->pos}; curr->min = {curr->x, curr->pos}; curr->minDiff = {INF, INF}; if (curr->left != nullptr) { curr->max = std::max(curr->max, curr->left->max); curr->min = std::min(curr->min, curr->left->min); curr->minDiff = std::min(curr->minDiff, curr->left->minDiff); curr->minDiff = std::min(curr->minDiff, {curr->x - curr->left->max.first, abs(curr->pos - curr->left->max.second)}); } if (curr->right != nullptr) { curr->max = std::max(curr->max, curr->right->max); curr->min = std::min(curr->min, curr->right->min); curr->minDiff = std::min(curr->minDiff, curr->right->minDiff); curr->minDiff = std::min(curr->minDiff, {curr->right->min.first - curr->x, abs(curr->pos - curr->right->min.second)}); } } void split(Node *curr, Node *&left, Node *&right, llong value) { if (curr == nullptr) { left = right = nullptr; return; } if (curr->x < value) { left = curr; split(curr->right, left->right, right, value); recover(left); } else { right = curr; split(curr->left, left, right->left, value); recover(right); } } void merge(Node *&curr, Node *left, Node *right) { if (left == nullptr) { curr = right; return; } if (right == nullptr) { curr = left; return; } if (left->y > right->y) { curr = left; merge(curr->right, left->right, right); } else { curr = right; merge(curr->left, left, right->left); } recover(curr); } void insert(llong h, int pos) { Node *left, *right, *newNode = new Node(h, pos, rng()); split(treap, left, right, h); merge(left, left, newNode); merge(treap, left, right); } void erase(llong l, llong r) { Node *left, *right, *rl, *rr; split(treap, left, right, l); split(right, rl, rr, r + 1); merge(treap, left, rr); } std::pair query(llong l, llong r) { Node *left, *right, *rl, *rr; split(treap, left, right, l); split(right, rl, rr, r + 1); std::pair answer = {-1, -1}; if (rl != nullptr && rl->minDiff.first != INF) { answer = rl->minDiff; } merge(right, rl, rr); merge(treap, left, right); return answer; } }; Treap treap; llong h[MAXN]; void solve() { int count = 0; for (int i = 1 ; i <= n ; ++i) { count++; treap.insert(h[i], count); } for (int i = 1 ; i <= q ; ++i) { int qType; std::cin >> qType; if (qType == 1) { llong l, r; std::cin >> l >> r; auto res = treap.query(l, r); std::cout << res.first << ' ' << res.second << '\n'; continue; } if (qType == 2) { count++; llong height; std::cin >> height; treap.insert(height, count); continue; } if (qType == 3) { llong l, r; std::cin >> l >> r; treap.erase(l, r); continue; } exit(-1); } } void input() { std::cin >> n; for (int i = 1 ; i <= n ; ++i) { std::cin >> h[i]; } std::cin >> q; } void fastIOI() { freopen("treefarm.in", "r", stdin); freopen("treefarm.out", "w", stdout); std::ios_base :: sync_with_stdio(0); std::cout.tie(nullptr); std::cin.tie(nullptr); } int main() { fastIOI(); input(); solve(); return 0; } /* 6 6 3 9 10 12 8 1 1 2 8 6 6 3 9 10 12 8 5 1 2 8 2 7 1 2 8 3 1 9 1 1 15 6 6 3 9 10 12 8 3 1 2 8 2 7 1 2 8 3 1 9 1 1 15 */