Submission #1186956

#TimeUsernameProblemLanguageResultExecution timeMemory
1186956_rain_Tenis (COI19_tenis)C++20
100 / 100
212 ms3904 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MAXN = 1e5 + 100;
int rv[3][MAXN];
int sg[4*MAXN], lazy[4*MAXN];
void init(int k, int a, int b) {
	if (a == b) {
		sg[k] = a;
		return ;
	}
	init(2*k, a, (a+b)/2);
	init(2*k+1, (a+b)/2+1, b);
	sg[k] = min(sg[2*k], sg[2*k+1]);
}

void push(int k, int a, int b) {
	sg[k] += lazy[k];
	if (a != b) {
		lazy[2*k] += lazy[k];
		lazy[2*k+1] += lazy[k];
	}
	lazy[k] = 0;
}

void update(int k, int a, int b, int q_l, int q_r, int val) {
	push(k, a, b);
	if (q_r < a || q_l > b)
		return ;
	if (q_l <= a && b <= q_r) {
		lazy[k] += val;
		push(k, a, b);
		return ;
	}
	update(2*k, a, (a+b)/2, q_l, q_r, val);
	update(2*k+1, (a+b)/2+1, b, q_l, q_r, val);
	sg[k] = min(sg[2*k], sg[2*k+1]);
}

int query(int k, int a, int b) {
	push(k, a, b);
	if (a == b) {
		return a;
	}
	push(2*k, a, (a+b)/2);
	push(2*k+1, (a+b)/2+1, b);
	if (sg[2*k] == 0)
		return query(2*k, a, (a+b)/2);
	return query(2*k+1, (a+b)/2+1, b);
}

int maxi(int x, int y, int z) {
	return max(x, max(y, z));
}

int main() {

	int N, Q;
	cin >> N >> Q;

	for (int i = 1; i <= N; i++) {
		int x; cin >> x;
		rv[0][x] = i;
	}
	for (int i = 1; i <= N; i++) {
		int x; cin >> x;
		rv[1][x] = i;
	}
	for (int i = 1; i <= N; i++) {
		int x; cin >> x;
		rv[2][x] = i;
	}
	init(1, 1, N);

	for (int i = 1; i <= N; i++)
		update(1, 1, N, maxi(rv[0][i], rv[1][i], rv[2][i]), N, -1);
	while (Q--) {
		int type;
		cin >> type;
		if (type == 1) {
			int x; cin >> x;
			if (maxi(rv[0][x], rv[1][x], rv[2][x]) <= query(1, 1, N))
				cout << "DA" << "\n";
			else
				cout << "NE" << "\n";
		} else {
			int p, a, b;
			cin >> p >> a >> b;
			update(1, 1, N, maxi(rv[0][a], rv[1][a], rv[2][a]), N, 1);
			update(1, 1, N, maxi(rv[0][b], rv[1][b], rv[2][b]), N, 1);
			swap(rv[p-1][a], rv[p-1][b]);
			update(1, 1, N, maxi(rv[0][a], rv[1][a], rv[2][a]), N, -1);
			update(1, 1, N, maxi(rv[0][b], rv[1][b], rv[2][b]), N, -1);
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...