import java.io.*; import java.util.*; import java.util.function.*; import java.util.stream.*; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(); int n = sc.nextInt(); SegmentTree st = new SegmentTree(n); for (int i = 0; i < n; i++) { st.setValue(i, sc.nextInt() - 1); } st.calc(0); int q = sc.nextInt(); StringBuilder sb = new StringBuilder(); while (q-- > 0) { if (sc.nextInt() == 1) { sb.append(st.getLength(sc.nextInt() - 1, sc.nextInt())).append("\n"); } else { st.setValue(sc.nextInt() - 1, sc.nextInt(), sc.nextInt() - 1); } } System.out.print(sb); } static class SegmentTree { int size; int[] values; int[] lengths; int[][][] counts; int[][] NONE = new int[4][4]; public SegmentTree(int x) { size = 2; while (size < x) { size <<= 1; } values = new int[size * 2 - 1]; Arrays.fill(values, -1); counts = new int[size * 2 - 1][4][4]; lengths = new int[size * 2 - 1]; } public void setValue(int idx, int v) { lengths[size + idx - 1] = 1; setTreeValue(size + idx - 1, v); } private void setTreeValue(int current, int v) { values[current] = v; for (int i = 0; i < 4; i++) { for (int j = i; j < 4; j++) { if (v >= i && v <= j) { counts[current][i][j] = lengths[current]; } } } } public void calc(int idx) { if (idx >= size - 1) { return; } calc(idx * 2 + 1); calc(idx * 2 + 2); calcCount(idx); lengths[idx] = lengths[idx * 2 + 1] + lengths[idx * 2 + 2]; } private void calcCount(int idx) { for (int i = 0; i < 4; i++) { for (int j = i; j < 4; j++) { for (int k = i; k <= j; k++) { counts[idx][i][j] = Math.max(counts[idx][i][j], counts[idx * 2 + 1][i][k] + counts[idx * 2 + 2][k][j]); } } } } public void setValue(int left, int right, int v) { setValue(0, 0, size, left, right, v, -1); } private void setValue(int idx, int min, int max, int left, int right, int v, int second) { if (max <= left || right <= min) { if (second == -1) { return; } setTreeValue(idx, second); } else if (left <= min && max <= right) { setTreeValue(idx, v); } else { if (values[idx] >= 0) { second = values[idx]; } setValue(idx * 2 + 1, min, (min + max) / 2, left, right, v, second); setValue(idx * 2 + 2, (min + max) / 2, max, left, right, v, second); calcCount(idx); values[idx] = -1; } } public int getLength(int left, int right) { int[][] current = getLength(0, 0, size, left, right); return current[0][3]; } private int[][] getLength(int idx, int min, int max, int left, int right) { if (max <= left || right <= min) { return NONE; } else if (left <= min && max <= right) { return counts[idx]; } int[][] ans = new int[4][4]; if (values[idx] >= 0) { for (int i = 0; i < 4; i++) { for (int j = i; j < 4; j++) { if (i <= values[idx] && values[idx] <= j) { ans[i][j] = Math.min(right, max) - Math.max(left, min); } } } return ans; } int[][] lefts = getLength(idx * 2 + 1, min, (min + max) / 2, left, right); int[][] rights = getLength(idx * 2 + 2, (min + max) / 2, max, left, right); for (int i = 0; i < 4; i++) { for (int j = i; j < 4; j++) { for (int k = i; k <= j; k++) { ans[i][j] = Math.max(ans[i][j], lefts[i][k] + rights[k][j]); } } } return ans; } } } class Scanner { BufferedReader br; StringTokenizer st = new StringTokenizer(""); StringBuilder sb = new StringBuilder(); public Scanner() { try { br = new BufferedReader(new InputStreamReader(System.in)); } catch (Exception e) { } } public int nextInt() { return Integer.parseInt(next()); } public long nextLong() { return Long.parseLong(next()); } public double nextDouble() { return Double.parseDouble(next()); } public String next() { try { while (!st.hasMoreTokens()) { st = new StringTokenizer(br.readLine()); } } catch (Exception e) { e.printStackTrace(); } finally { return st.nextToken(); } } }