Skip to content

Commit 53803c7

Browse files
committed
avl till 69 test
1 parent 6e9779a commit 53803c7

1 file changed

Lines changed: 186 additions & 0 deletions

File tree

4/avl.cpp

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
#include <iostream>
2+
3+
#define x 1000000001
4+
long long g_sum = 0;
5+
6+
long long f(long long val) {
7+
return (val % x + g_sum % x) % x;
8+
}
9+
10+
11+
struct Node {
12+
long long key;
13+
unsigned char height;
14+
Node *left;
15+
Node *right;
16+
Node(int k) : key(k), height(1), left(NULL), right(NULL) {}
17+
};
18+
19+
unsigned char height(Node *p) {
20+
return p ? p->height : 0;
21+
}
22+
23+
int bfactor(Node *p) {
24+
return height(p->right) - height(p->left);
25+
}
26+
27+
void fixHeight(Node *p) {
28+
unsigned char hl = height(p->left);
29+
unsigned char hr = height(p->right);
30+
p->height = (hl > hr ? hl : hr) + 1;
31+
}
32+
33+
Node* rotateRight(Node *p) {
34+
Node *q = p->left;
35+
p->left = q->right;
36+
q->right = p;
37+
fixHeight(p);
38+
fixHeight(q);
39+
return q;
40+
}
41+
42+
Node* rotateLeft(Node *q) {
43+
Node *p = q->right;
44+
q->right = p->left;
45+
p->left = q;
46+
fixHeight(q);
47+
fixHeight(p);
48+
return p;
49+
}
50+
51+
Node* balance(Node *p) {
52+
fixHeight(p);
53+
if (bfactor(p) == 2) {
54+
if (bfactor(p->right) < 0)
55+
p->right = rotateRight(p->right);
56+
return rotateLeft(p);
57+
}
58+
if (bfactor(p) == -2) {
59+
if (bfactor(p->left) > 0)
60+
p->left = rotateLeft(p->left);
61+
return rotateRight(p);
62+
}
63+
return p;
64+
}
65+
66+
Node* insert(Node *p, long long k) {
67+
if (!p)
68+
return new Node(k);
69+
if (k < p->key)
70+
p->left = insert(p->left, k);
71+
else if (k > p->key)
72+
p->right = insert(p->right, k);
73+
return balance(p);
74+
}
75+
76+
Node* findMin(Node *p) {
77+
return p->left ? findMin(p->left) : p;
78+
}
79+
80+
Node* removeMin(Node* p) {
81+
if (!p->left)
82+
return p->right;
83+
p->left = removeMin(p->left);
84+
return balance(p);
85+
}
86+
87+
Node* remove(Node *p, long long k) {
88+
if (!p)
89+
return NULL;
90+
if (k < p->key)
91+
p->left = remove(p->left, k);
92+
else if (k > p->key)
93+
p->right = remove(p->right, k);
94+
else {
95+
Node *q = p->left;
96+
Node *r = p->right;
97+
delete p;
98+
p = NULL;
99+
if (!r)
100+
return q;
101+
Node *min = findMin(r);
102+
min->right = removeMin(r);
103+
min->left = q;
104+
return balance(min);
105+
}
106+
return balance(p);
107+
}
108+
109+
void find(Node *node, long long k) {
110+
if (!node) {
111+
std::cout << "Not found" << std::endl;
112+
return ;
113+
}
114+
if (node->key == k) {
115+
std::cout << "Found" << std::endl;
116+
return ;
117+
}
118+
else if (k < node->key)
119+
find(node->left, k);
120+
else if (k > node->key)
121+
find(node->right, k);
122+
}
123+
124+
void inOrder(Node *v, long long const &left, long long const &right,long long &res) {
125+
if (!v)
126+
return;
127+
inOrder(v->left, left, right, res);
128+
if (v->key >= left && v->key <= right)
129+
res += v->key;
130+
inOrder(v->right, left, right, res);
131+
}
132+
133+
long long sum(Node *node, long long left, long long right) {
134+
long long sum = 0;
135+
inOrder(node, left, right, sum);
136+
g_sum = sum;
137+
return sum;
138+
}
139+
140+
void preOrder(Node *v) {
141+
if (!v)
142+
return;
143+
std::cout << v->key << " ";
144+
preOrder(v->left);
145+
preOrder(v->right);
146+
}
147+
148+
int main()
149+
{
150+
unsigned n;
151+
long long key;
152+
long long l, r;
153+
l = r = 0;
154+
Node *tree = NULL;
155+
std::cin >> n;
156+
157+
std::string operation;
158+
for (unsigned i = 0; i < n; ++i) {
159+
std::cin >> operation;
160+
if (operation == "+") {
161+
std::cin >> key;
162+
tree = insert(tree, f(key));
163+
}
164+
else if (operation == "-") {
165+
std::cin >> key;
166+
tree = remove(tree, f(key));
167+
}
168+
else if (operation == "?") {
169+
std::cin >> key;
170+
find(tree, f(key));
171+
}
172+
else if (operation == "s") {
173+
174+
std::cin >> l >> r;
175+
std::cout << sum(tree, f(l), f(r)) <<std::endl;
176+
}
177+
/*
178+
std::cout << "--------------------" << std::endl;
179+
preOrder(tree);
180+
std::cout << std::endl;
181+
std::cout << "--------------------" << std::endl;
182+
*/
183+
}
184+
return 0;
185+
}
186+

0 commit comments

Comments
 (0)