CSES - Leirikisa 3 - Results
Submission details
Task:Bittilista
Sender:ollpu
Submission time:2016-07-29 14:12:59 +0300
Language:C++
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
Test results
testverdicttimegroup
#10.14 s1details
#20.14 s1details
#30.14 s1details
#40.13 s1details
#50.14 s1details
#60.15 s2details
#70.14 s2details
#80.15 s2details
#90.16 s2details
#100.14 s2details
#110.15 s3details
#120.14 s3details
#130.14 s3details
#140.15 s3details
#150.14 s3details

Code

#include <iostream>
using namespace std;
struct node {
	node* left;
	node* right;
	int pr, size;
	unsigned long val, diff, sum;
	bool flip;
	node(unsigned long v) {
		left = nullptr;
		right = nullptr;
		size = 1;
		pr = rand();
		val = v;
		diff = 0;
		flip = 0;
		sum = 0;
	}
};

int size(node* s) {
	if (s == nullptr) return 0;
	return s->size;
}

unsigned long sum(node* s) {
	if (s == nullptr) return 0;
	return s->sum;
}

void lazy_pull(node* s) {
	if (s == nullptr) return;
	s->size = size(s->left) + size(s->right) + 1;
	s->sum = s->val + sum(s->left) + sum(s->right);
}

void lazy_push(node* s) {
	if (s == nullptr) return;
	if (s->flip) {
		swap(s->left, s->right);
		if (s->left != nullptr) s->left->flip = !s->left->flip;
		if (s->right != nullptr) s->right->flip = !s->right->flip;
		s->flip = false;
	}
	if (s->left != nullptr) s->left->diff += s->diff;
	if (s->right != nullptr) s->right->diff += s->diff;
	s->val += s->diff;
	s->diff = 0;
}

void join(node*& s, node* left, node* right) {
	lazy_push(left);
	lazy_push(right);
	if (left == nullptr) s = right;
	else if (right == nullptr) s = left;
	else {
		if (left->pr > right->pr) {
			join(left->right, left->right, right);
			s = left;
		} else {
			join(right->left, left, right->left);
			s = right;
		}
	}
	lazy_pull(s);
}

void split(node* s, node*& left, node*& right, int k) {
	if (s == nullptr) {
		left = nullptr;
		right = nullptr;
		return;
	}
	lazy_push(s);
	if (size(s->left) >= k) {
		split(s->left, left, s->left, k);
		right = s;
	} else {
		split(s->right, s->right, right, k - size(s->left) - 1);
		left = s;
	}
	lazy_pull(s);
}

void getindex(node* s, node*& result, int i) {
	lazy_push(s);
	if (size(s->left) == i) {
		result = s;
	} else if (size(s->left) > i) {
		getindex(s->left, result, i);
	} else {
		getindex(s->right, result, i-size(s->left)-1);
	}
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, q;
	cin >> n >> q;
	node *tree = nullptr;
	for (int i = 0; i < n; ++i) {
		join(tree, tree, new node(0));
	}
	for (int qi = 0; qi < q; ++qi) {
		char c;
		int a, b;
		cin >> c >> a >> b;
		node *left, *middle, *right;
		split(tree, left, middle, a-1);
		split(middle, middle, right, b-a+1);
		if (c == 'S') {
			cout << sum(middle) << '\n';
		} else if (c == 'R') {
			middle->flip = !middle->flip;
		} else {
			unsigned long d;
			cin >> d;
			middle->diff += d;
		}
		join(tree, left, middle);
		join(tree, tree, right);
	}
}

Test details

Test 1

Group: 1

Verdict:

input
10 54

correct output
0001101010

user output
(empty)

Test 2

Group: 1

Verdict:

input
10 302

correct output
1001011011

user output
(empty)

Test 3

Group: 1

Verdict:

input
10 241

correct output
0111100000

user output
(empty)

Test 4

Group: 1

Verdict:

input
10 382

correct output
1011111011

user output
(empty)

Test 5

Group: 1

Verdict:

input
10 138

correct output
0100010010

user output
(empty)

Test 6

Group: 2

Verdict:

input
20 131002

correct output
00111111111101110010

user output
(empty)

Test 7

Group: 2

Verdict:

input
20 441567

correct output
11010111100110111101

user output
(empty)

Test 8

Group: 2

Verdict:

input
20 109770

correct output
00110101100110010010

user output
(empty)

Test 9

Group: 2

Verdict:

input
20 327308

correct output
10011111110100010111

user output
(empty)

Test 10

Group: 2

Verdict:

input
20 302918

correct output
10010011111010001011

user output
(empty)

Test 11

Group: 3

Verdict:

input
50 216967103451763

correct output
011000101010101001001011100100...

user output
(empty)

Test 12

Group: 3

Verdict:

input
50 236618662270629

correct output
011010111001101000001001101001...

user output
(empty)

Test 13

Group: 3

Verdict:

input
50 426560943304480

correct output
110000011111101000111010110000...

user output
(empty)

Test 14

Group: 3

Verdict:

input
50 294553802415801

correct output
100001011111001010010011011000...

user output
(empty)

Test 15

Group: 3

Verdict:

input
50 502225394100883

correct output
111001000110001010111011000110...

user output
(empty)