| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 17872 | chrome | 입자 가속기 (IZhO11_collider) | C++98 | 185 ms | 50232 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define foreach(it, S) for (__typeof (S.begin()) it = S.begin(); it != S.end(); it++)
#define all(x) x.begin(), x.end()
#define endl '\n'
#define _ ios_base :: sync_with_stdio(false); cin.tie(NULL);
#ifdef inputf
	#define fname ""
#else
	#define fname "" // <- Here
#endif
const double eps = 1e-9;
const int MaxN = int(2e5) + 256;
const int MOD = int(1e9) + 7;
template <typename T> inline T gcd(T a, T b) {
	return b ? gcd (b, a % b) : a;
}
inline bool Palindrome(const string& s) {
	return equal(s.begin(), s.end(), s.rbegin());
}
struct node {
	node *l, *r;
	int cnt, x, y;
	node() {}
	node(int x) : x(x), cnt(1), y(rand()), l(NULL), r(NULL) {}
};
typedef node* pnode;
                          
inline int getCnt(pnode &t) {
	return t ? t -> cnt : 0;
}
inline void upd(pnode &t) {
	if (!t)
		return;
	t -> cnt = getCnt(t -> l) + getCnt(t -> r) + 1;
}
pnode Merge(pnode a, pnode b) {
	if (!a)
		return b;
	if (!b)
		return a;
	if (a -> y > b -> y) {
		a -> r = Merge(a -> r, b);
		upd(a);
		return a;
	} else {
		b -> l = Merge(a, b -> l);
		upd(b);
		return b;
	}	
}
void Split(pnode t, int key, pnode &a, pnode &b) {
	if (!t)
		return void(a = b = NULL);
	int cur = getCnt(t -> l) + 1;
	if (cur < key) {
		Split(t -> r, key - cur, t -> r, b);
		a = t;
	} else {
		Split(t -> l, key, a, t -> l);
		b = t;
	}
	upd(a); upd(b);
}
int val[256];
char rvl[4];
void print(pnode t) {
	if (!t)
		return;
	print(t -> l);
	cerr << rvl[t -> x] << " ";
	print(t -> r);
}
inline void Replace(pnode &t, int a, int b) {
	if (a < b) {
		pnode L, R, M1, M2, M3;
		Split(t, a, L, M1);
		Split(M1, 2, M1, M2);
		Split(M2, b - a + 1, M2, R);
		// cerr << a << " " << b << "\n";
		// cerr << "L: "; print(L); cerr << endl; 
		// cerr << "M1: "; print(M1); cerr << endl; 
		// cerr << "M2: "; print(M2); cerr << endl; 
		// cerr << "R: "; print(R); cerr << endl; 
		t = Merge(L, Merge(M2, Merge(M1, R)));
	} else {
		// cerr << "~"; print(t); cerr << endl;
		pnode L, R, M1, M2, M3;
		Split(t, a, L, R);
		Split(R, 2, M1, R);
		Split(L, b, L, M2);
		// cerr << a << " " << b << "\n";
		// cerr << "L: "; print(L); cerr << endl; 
		// cerr << "M1: "; print(M1); cerr << endl; 
		// cerr << "M2: "; print(M2); cerr << endl; 
		// cerr << "R: "; print(R); cerr << endl; 
		t = Merge(L, Merge(M1, Merge(M2, R)));
	}
}
inline char get(pnode &t, int i) {
	pnode L, M, R;
	Split(t, i, L, R);
	Split(R, 2, M, R);
	int val = M -> x;
	t = Merge(L, Merge(M, R));
	return rvl[val];
}
int main() { _
	#ifdef lcl
		freopen(fname".in", "r", stdin);
		freopen(fname".out", "w", stdout);
	#endif
	int n, m; cin >> n >> m;
	pnode t = NULL;
	
	val['x'] = 1; val['y'] = 2; val['z'] = 3;
	rvl[1] = 'x'; rvl[2] = 'y'; rvl[3] = 'z';
	
	string s; cin >> s;
	for (int i = 0; i < n; ++i)
		t = Merge(t, new node(val[s[i]]));
	for (int i = 0; i < m; ++i) {
		char op; cin >> op;
		if (op == 'a') {
			int a, b; cin >> a >> b;
			Replace(t, a, b);
		} else {
			int x; cin >> x;
			cout << get(t, x) << endl;
		}
		// print(t); cerr << endl;
	}
	return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
