#include #include #include #include using namespace std; const int MAXN = 100000 + 5; struct node { int l, r; pair best; } tree[4][MAXN * 10]; int x[MAXN], y[MAXN], n, i, j, m, pos, L, R, w[4]; string op; void init (int q, int pos, int l, int r) { tree[q][pos].l = l; tree[q][pos].r = r; if (l < r) { init(q, pos + pos, l, (l + r) / 2); init(q, pos + pos + 1, (l + r) / 2 + 1, r); } } void modify (int q, int pos, int j, pair x) { if (tree[q][pos].l == tree[q][pos].r) tree[q][pos].best = x; else { if (tree[q][pos + pos].r >= j) modify(q, pos + pos, j, x); else modify(q, pos + pos + 1, j, x); tree[q][pos].best = max(tree[q][pos + pos].best, tree[q][pos + pos + 1].best); } } pair query (int q, int pos, int l, int r) { if (tree[q][pos].l == l && tree[q][pos].r == r) return tree[q][pos].best; pair ret = make_pair(-2000000001, -2000000001); if (l <= min(tree[q][pos + pos].r, r)) ret = max(ret, query(q, pos + pos, l, min(tree[q][pos + pos].r, r))); if (max(l, tree[q][pos + pos + 1].l) <= r) ret = max(ret, query(q, pos + pos + 1, max(tree[q][pos + pos + 1].l, l), r)); return ret; } void update (int i) { modify(0, 1, i, make_pair(x[i] + y[i], i)); modify(1, 1, i, make_pair(x[i] - y[i], i)); modify(2, 1, i, make_pair(-x[i] + y[i], i)); modify(3, 1, i, make_pair(-x[i] - y[i], i)); } int main (int argc, char * const argv[]) { // freopen("input.txt", "r", stdin); cin >> n; for(int i = 1; i <= n; i++) cin >> x[i] >> y[i]; for(int i = 0; i < 4; i++) init(i, 1, 1, n); for(int i = 1; i <= n; i++) update(i); cin >> m; for(int i = 0; i < m; i++) { cin >> op; if (op == "U") { cin >> pos; ++pos; cin >> x[pos] >> y[pos]; update(pos); } else { long long ret = 0; cin >> L >> R; assert(L <= R); ++L; ++R; for(int j = 0; j < 4; j++) w[j] = query(j, 1, L, R).second; for(int j = 0; j < 4; j++) for(int k = j + 1; k < 4; k++) ret = max(ret, abs(x[w[j]] * 1LL - x[w[k]]) + abs(y[w[j]] * 1LL - y[w[k]])); cout << ret << endl; } } return 0; }