给定10 ^ 18×10 ^ 18的矩阵。每个单元格都是0或1.最初都是0。
现在我们需要执行Q查询。我们有两种类型的查询:
1 x l r :如果public class RedirectPrintStream extends PrintStream {
private static String NEW_LINE = String.format("%n"); // This creates the system-specific line break (depends on Windows/Linux/etc)
public RedirectPrintStream(OutputStream out) {
super(out);
}
@Override
public void print(String obj) {
super.print(obj); // or check here if the obj.length > 80 and add another line break, etc.
super.print(NEW_LINE);
}
public static void main(String[] args) {
PrintStream old = System.out;
System.setOut( new RedirectPrintStream(old));
System.out.print("Hello");
System.out.print("World"); // will be printed in a new line instead of the same
}
}
,则表示我们应该切换行l,l + 1,...,r中所有单元格的值。
否则x = 0
我们应该对列号l,l + 1,... r。
2 lrxy :我们需要在此矩阵的子矩形中打印标记为1的单元格数,包括行号l,l + 1,...,r和列号x, x + 1,...,y。
现在,如果矩阵的大小很小,这可能已经完成了。但是如何为10 ^ 18大小的矩阵做到这一点?我们无法创建矩阵,我们需要一些算法以有效的方式存储这些值来回答所有查询。
查询次数最多可达100 000次。如何有效地执行此操作?