답안 #37677

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
37677 2017-12-27T01:00:19 Z 14kg 원숭이와 사과 나무 (IZhO12_apple) C++11
0 / 100
0 ms 1112 KB
#include <stdio.h>
#include <algorithm>
#define NN 1073741824

using namespace std;
struct TREE {
	int num;
	bool check;
	TREE *left, *right, *up;
} *top;

int f(TREE *node, int l, int r, int x, int y) {
	int mid = (l + r) / 2;

	if (x <= l && r <= y) return node->num;
	if (r < x || y < l) return 0;

	if (node->left == NULL) {
		node->left = (TREE*)malloc(sizeof(TREE));
		node->left->left = node->left->right = NULL;
		node->left->up = node;
		node->left->num = node->check ? (mid - l + 1) : 0;
		node->left->check = node->check;
	}
	if (node->right == NULL) {
		node->right = (TREE*)malloc(sizeof(TREE));
		node->right->left = node->right->right = NULL;
		node->right->up = node;
		node->right->num = node->check ? (mid - l + 1) : 0;
		node->right->check = node->check;
	}
	return f(node->left, l, mid, x, y) + f(node->right, mid + 1, r, x, y);
}
void Push(TREE *node, int l, int r, int x, int y) {
	int mid = (l + r) / 2;

	if (x <= l && r <= y) {
	//	printf("Push) %d %d\n", l, r);
		node->num = r - l + 1;
		node->check = true;
		return;
	}
	if (r < x || y < l) return;

	if (node->left == NULL) {
		node->left = (TREE*)malloc(sizeof(TREE));
		node->left->left = node->left->right = NULL;
		node->left->up = node;
		node->left->num = node->check ? (mid - l + 1) : 0;
		node->left->check = node->check;
	}
	if (node->right == NULL) {
		node->right = (TREE*)malloc(sizeof(TREE));
		node->right->left = node->right->right = NULL;
		node->right->up = node;
		node->right->num = node->check ? (mid - l + 1) : 0;
		node->right->check = node->check;
	}
	Push(node->left, l, mid, x, y);
	Push(node->right, mid + 1, r, x, y);
	node->num = node->left->num + node->right->num;
}
int main() {
	int k, s, x, y, C = 0;

	top= (TREE*)malloc(sizeof(TREE));
	top->check = false;
	top->left = top->right = top->up = NULL;

	scanf("%d", &k);
	while (k--) {
		scanf("%d %d %d", &s, &x, &y);
		x += C, y += C;
		if (s == 1) {
			printf("%d\n", C = f(top, 1, NN, x, y));
		}
		else {
			Push(top, 1, NN, x, y);
		}
	}
	getchar(), getchar();
}

Compilation message

apple.cpp: In function 'int main()':
apple.cpp:70:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &k);
                 ^
apple.cpp:72:32: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &s, &x, &y);
                                ^
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1112 KB Output is correct
2 Correct 0 ms 1112 KB Output is correct
3 Incorrect 0 ms 1112 KB Output isn't correct
4 Halted 0 ms 0 KB -