This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "seats.h"
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class segment_tree {
private:
	static const int inf = 1012345678;
	int sz; bool ismax;
	vector<int> val;
public:
	segment_tree() : sz(0), ismax(false), val() {};
	segment_tree(int N, const string& type_) : ismax(type_ == "max") {
		sz = 1;
		while(sz < N) sz *= 2;
		val = vector<int>(sz * 2, ismax ? -inf : inf);
	}
	void update(int pos, int x) {
		pos += sz;
		val[pos] = x;
		while(pos > 1) {
			pos >>= 1;
			val[pos] = (ismax ? max(val[pos * 2], val[pos * 2 + 1]) : min(val[pos * 2], val[pos * 2 + 1]));
		}
	}
	int range_query(int l, int r) {
		l += sz; r += sz;
		int ans = (ismax ? -inf : inf);
		while(l != r) {
			if(l & 1) ans = (ismax ? max(ans, val[l]) : min(ans, val[l])), ++l;
			if(r & 1) --r, ans = (ismax ? max(ans, val[r]) : min(ans, val[r]));
			l >>= 1; r >>= 1;
		}
		return ans;
	}
};
int H, W, sum; vector<int> X, Y, sxl, sxr, syl, syr, flag;
void give_initial_chart(int H_, int W_, std::vector<int> X_, std::vector<int> Y_) {
	H = H_; W = W_; X = X_; Y = Y_;
	sxl.resize(H * W);
	sxr.resize(H * W);
	syl.resize(H * W);
	syr.resize(H * W);
	sxl[0] = X[0]; sxr[0] = X[0]; syl[0] = Y[0]; syr[0] = Y[0];
	for(int i = 1; i < H * W; ++i) {
		sxl[i] = min(sxl[i - 1], X[i]);
		sxr[i] = max(sxr[i - 1], X[i]);
		syl[i] = min(syl[i - 1], Y[i]);
		syr[i] = max(syr[i - 1], Y[i]);
	}
	sum = 0;
	flag.resize(H * W);
	for(int i = 0; i < H * W; ++i) {
		int d = (sxr[i] - sxl[i] + 1) * (syr[i] - syl[i] + 1);
		flag[i] = (d == i + 1 ? 1 : 0);
		sum += flag[i];
	}
}
int swap_seats(int va, int vb) {
	if(va > vb) swap(va, vb);
	swap(X[va], X[vb]);
	swap(Y[va], Y[vb]);
	if(va == 0) {
		sxl[0] = X[0]; sxr[0] = X[0]; syl[0] = Y[0]; syr[0] = Y[0];
	}
	for(int i = max(va, 1); i < vb; ++i) {
		sxl[i] = min(sxl[i - 1], X[i]);
		sxr[i] = max(sxr[i - 1], X[i]);
		syl[i] = min(syl[i - 1], Y[i]);
		syr[i] = max(syr[i - 1], Y[i]);
	}
	for(int i = va; i < vb; ++i) {
		int d = (sxr[i] - sxl[i] + 1) * (syr[i] - syl[i] + 1);
		sum -= flag[i];
		flag[i] = (d == i + 1 ? 1 : 0);
		sum += flag[i];
	}
	return sum;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |