私のコードスタイル
- ブレースの改行(これは実際には非常に重要であると言わなければならない
- 常に使用
using namespace std;
- 通常、ヘッダファイルだけで
#include <bits/stdc++.h>
本当に簡単に多くの - 高速読み込みと高速出力を使用しますが
fread, fwrite
、使用しません。これについては後で説明します - プリコンパイルされたコマンドを使用して、いくつかの短い非再帰関数を定義してみてください。
- ローカルでファイル操作を使用する
++a
、a--
などにはスペースがありません- 行末に余分なスペースを入れないようにしてください
- 関数内に空白行があってはならず、各関数の間には空白行が必要です
- 短い機能しない中
#define
で、すべての状況下ではinline
、インライン - 例えば、
+-*/ << >> & ^ ~ % | < >
すべての両側の空間が、特に!
スペースを含まない右側 ()
左角括弧の左側にスペースがあり、右角括弧の右側にスペースがあります- 三眼鏡の演算子には両側にスペースがあります
- 変数名はできるだけ明確で、表示が許可されていない
aa, bb, ii, jj, ll, rr, ldak
名前にする必要があります - 単一行ループには中括弧がありません。これは、長さが1行に書き込むかどうかを決定することを示します
- テンプレートクラス名は次のように使用されます
template <typename KYN>
- 以下のために
long long
長い変数名などを使用しているtypedef long long ll;
と使用#define
- 以下のための
ch <= '9' && ch >= '0'
使用isdigit(ch)
の代わりに、 - 可能な限りビット演算を使用できる/ビット演算
- 高度なツリー構造はポインタで実装され、クラスを記述します
- STLを使用しないでください
stack
とlist
- 関数の最後には、持っている必要があり
return
ますがvoid
ありません 独自の名前空間namespace RSX_love_KYN
- より多く使用するようにしてください
#define
例えば、コードを簡素化するために:#defien sit std::string::iterator
彼らが理解できることを確認
サンプルプログラム
#include <bits/stdc++.h>
using namespace std;
#define gc() getchar()
#define pc(i) putchar(i)
template <typename KYN>
inline KYN read()
{
KYN x = 0;
char ch = gc();
bool f = 0;
while(!isdigit(ch))
{
f = (ch == '-');
ch = gc();
}
while(isdigit(ch))
{
x = x * 10 + (ch - '0');
ch = gc();
}
return f ? -x : x;
}
template <typename KYN>
void put(KYN x)
{
if(x < 0)
{
x = -x;
pc('-');
}
if(x < 10) {
pc(x + 48);
return;
}
put(x / 10);
pc(x % 10 + 48);
return ;
}
#define vit std::vector <int>:: iterator
#define vi std::vector <int>
#define lbd(i, j, k) lower_bound(i, j, k)
#define pii std::pair <int, int>
#define mkp(i, j) std::make_pair(i, j)
#define lowbit(i) (i & -i)
#define ispow(i) (i == lowbit(i))
#define rdi() read <int> ()
#define rdl() read <long long> ()
#define pti(i) put <int> (i), putchar(' ')
#define ptl(i) put <long long> (i), putchar(' ')
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef unsigned long long ull;
typedef unsigned int ui;
const int Maxn = 1e6 + 1e5 + 111;
namespace RSX_love_KYN
{
const int MAXN = 1e6 + 1e5 + 111;
template <typename KYN>
class avlTree
{
private:
struct avlNode;
typedef avlNode *avl;
struct avlNode
{
avl ls, rs;
int size, height, num;
KYN data;
void update()
{
this->size = this->ls->size + this->rs->size + this->num;
this->height = max(this->ls->height , this->rs->height) + 1;
}
};
protected:
avl rot, null, tot, deleted[MAXN];
avlNode memory[MAXN];
int deltop;
inline avl init(KYN x)
{
avl tmp = deltop ? deleted[deltop--] : tot++;
tmp->ls = tmp->rs = null;
tmp->size = tmp->num = tmp->height = 1;
tmp->data = x;
return tmp;
}
inline avl Single_left(avl T)
{
avl a = T->ls;
T->ls = a->rs;
a->rs = T;
T->update();
a->update();
return a;
}
inline avl Single_right(avl T)
{
avl a = T->rs;
T->rs = a->ls;
a->ls = T;
T->update();
a->update();
return a;
}
inline avl double_left(avl T)
{
T->ls = Single_right(T->ls);
return Single_left(T);
}
inline avl double_right(avl T)
{
T->rs = Single_left(T->rs);
return Single_right(T);
}
avl insert(avl T, KYN x)
{
if(T == null) return init(x);
if(x == T->data)
{
++(T->num);
T->update();
return T;
}
if(x < T->data)
{
T->ls = insert(T->ls, x);
T->update();
if(T->ls->height - T->rs->height == 2)
{
if(x < T->ls->data) T = Single_left(T);
else T = double_left(T);
}
}
else
{
T->rs = insert(T->rs, x);
T->update();
if(T->rs->height - T->ls->height == 2)
{
if(T->rs->data < x) T = Single_right(T);
else T = double_right(T);
}
}
return T;
}
avl erase(avl T, KYN x)
{
if(T == null) return null;
if(x < T->data)
{
T->ls = erase(T->ls, x);
T->update();
if(T->rs->height - T->ls->height == 2)
{
if(T->rs->rs->height >= T->rs->ls->height) T = Single_right(T);
else T = double_right(T);
}
}
else if(T->data < x)
{
T->rs = erase(T->rs, x);
T->update();
if(T->ls->height - T->rs->height == 2)
{
if(T->ls->ls->height >= T->ls->rs->height) T = Single_left(T);
else T = double_left(T);
}
}
else
{
if(T->num > 1)
{
--(T->num);
T->update();
return T;
}
if(T->ls != null && T->rs != null)
{
avl p = T->rs;
while(p->ls != null) p = p->ls;
T->num = p->num;
T->data = p->data, p->num = 1;
T->rs = erase(T->rs, T->data);
T->update();
if(T->ls->height - T->rs->height == 2)
{
if(T->ls->ls->height >= T->ls->rs->height) T = Single_left(T);
else T = double_left(T);
}
}
else
{
avl p = T;
if(T->ls != null) T = T->ls;
else if(T->rs != null) T = T->rs;
else T = null;
deleted[++deltop] = p;
}
}
return T;
}
KYN get_rank(avl T, KYN x)
{
int ans = 0;
while(T != null)
{
if(T->data == x) { return ans + T->ls->size + 1; }
else if(x < T->data) { T = T->ls; }
else { ans += T->ls->size + T->num; T = T->rs; }
}
return ans + 1;
}
KYN get_data(avl T, int rank)
{
while(T != null)
{
if(T->ls->size >= rank) T = T->ls;
else if(T->ls->size + T->num >= rank) { return T->data; }
else { rank -= T->num + T->ls->size; T = T->rs; }
}
}
avl makeempty(avl x)
{
if(x == null) return null;
x->ls = makeempty(x->ls);
x->rs = makeempty(x->rs);
deleted[++deltop] = x;
return null;
}
void output(avl x)
{
if(x == null) return;
output(x->ls);
put <KYN> (x->data);
putchar(' ');
output(x->rs);
}
avl find(avl T, KYN x)
{
while(T != null) {
if(T->data == x) return T;
else if(T->data > x) { T = T->ls; }
else { T = T->rs; }
}
return null;
}
public:
KYN prv(KYN x)
{
KYN ans = KYN(-1 << 30);
avl tmp = rot;
while(tmp != null)
{
if(tmp->data == x)
{
if(tmp->ls != null)
{
tmp = tmp->ls;
while(tmp->rs != null) tmp = tmp->rs;
ans = tmp -> data;
}
break;
}
if(tmp->data < x && ans < tmp->data) ans = tmp->data;
tmp = tmp->data < x ? tmp->rs : tmp->ls;
}
return ans;
}
KYN next(KYN x) {
KYN ans = KYN(1 << 30);
avl tmp = rot;
while(tmp != null)
{
if(tmp->data == x)
{
if(tmp->rs != null)
{
tmp = tmp->rs;
while(tmp->ls != null) tmp = tmp->ls;
ans = tmp->data;
}
break;
}
if(x < tmp->data && tmp->data < ans) ans = tmp->data;
tmp = tmp->data < x ? tmp->rs : tmp->ls;
}
return ans;
}
avlTree()
{
deltop = 0;
null = new avlNode;
null->ls = null->rs = null;
null->size = null->height = null->num = 0;
rot = null;
tot = memory;
}
inline void insert(KYN x) { rot = insert(rot, x); return ; }
inline void erase(KYN x) { rot = erase(rot, x); }
inline int get_rank(KYN x) { return get_rank(rot, x); }
inline KYN get_data(int x) { return get_data(rot, x); }
void clear() { rot = makeempty(rot); }
bool find(KYN x) { return find(rot, x) != null; }
void output() { output(rot); }
KYN operator[] (int k) { return get_data(k); }
int size() { return rot->size; }
};
}
using namespace RSX_love_KYN;
int n, opt, x, m, last = 0, tmp, ans;
avlTree <int> tree;
int main() {
#ifdef _DEBUG
freopen("P6136_2.in", "r", stdin);
#endif
n = rdi(); m = rdi();
while(n--) tree.insert(rdi());
while(m--) {
opt = rdi(); x = rdi();
x ^= last;
switch (opt)
{
case 1: tree.insert(x); break;
case 2: tree.erase(x); break;
case 3: last = tree.get_rank(x); ans ^= last; break;
case 4: last = tree[x]; ans ^= last; break;
case 5: last = tree.prv(x); ans ^= last; break;
case 6: last = tree.next(x); ans ^= last; break;
}
}
pti(ans);
return 0;
}