Submission #578440
Source Code Expand
#include <stdio.h>
#include <stdlib.h>
typedef long int li;
typedef long long int lli;
typedef struct Node Node;
struct Node{
Node* Left;
Node* Parent;
Node* Right;
lli first;
lli second;
char Color;
char Isnil;
};
enum NodeColor{Red, Black};
enum RightLeft{Right, Left};
Node root = {&root,&root,&root,0,0,1,1};
li node_num = 0;
Node* make_node(lli f,lli s){
Node* n = (Node*)malloc(sizeof(Node));
if(n == NULL)
exit(EXIT_FAILURE);
n->first = f;
n->second = s;
n->Left = &root;
n->Parent = &root;
n->Right = &root;
n->Color = Red;
n->Isnil = 0;
return n;
}
void delete_node(Node* node){
free(node);
}
void SwapColor(Node *a, Node *b){
char c = a->Color;
a->Color = b->Color;
b->Color = c;
}
Node* MaxNode(Node* node){
Node *p = node;
while(!p->Right->Isnil)
p = p->Right;
return p;
}
Node* MinNode(Node* node){
Node *p = node;
while(!p->Left->Isnil)
p = p->Left;
return p;
}
Node* NextNode(Node* node){
Node *p = node;
if(p->Isnil)
;
else if(!p->Right->Isnil)
p = MinNode(p->Right);
else{
while(!p->Parent->Isnil && p == p->Parent->Right)
p = p->Parent;
p = p->Parent;
}
return p;
}
Node* PrevNode(Node* node){
Node *p = node;
if(p->Isnil)
p = p->Right;
else if(!p->Left->Isnil)
p = MaxNode(p->Left);
else{
while(!p->Parent->Isnil && p == p->Parent->Left)
p = p->Parent;
if(!p->Isnil)
p = p->Parent;
}
return p;
}
void Lrotate(Node* node){
Node *pnode = node->Right;
node->Right = pnode->Left;
if(!pnode->Left->Isnil)
pnode->Left->Parent = node;
pnode->Parent = node->Parent;
if(node == root.Parent)
root.Parent = pnode;
else if(node == node->Parent->Left)
node->Parent->Left = pnode;
else
node->Parent->Right = pnode;
pnode->Left = node;
node->Parent = pnode;
}
void Rrotate(Node* node){
Node *pnode = node->Left;
node->Left = pnode->Right;
if(!pnode->Right->Isnil)
pnode->Right->Parent = node;
pnode->Parent = node->Parent;
if(node == root.Parent)
root.Parent = pnode;
else if(node == node->Parent->Right)
node->Parent->Right = pnode;
else
node->Parent->Left = pnode;
pnode->Right = node;
node->Parent = pnode;
}
Node* erase(Node* node){
Node *wnode,*enode,*fnode,*fpnode,*pnode;
if(node->Isnil)
return &root;
enode = pnode = node;
wnode = NextNode(node);
if(pnode->Left->Isnil)
fnode = pnode->Right;
else if(pnode->Right->Isnil)
fnode = pnode->Left;
else{
pnode = wnode;
fnode = pnode->Right;
}
if(pnode == enode){
fpnode = enode->Parent;
if(!fnode->Isnil)
fnode->Parent = fpnode;
if(root.Parent == enode)
root.Parent =fnode;
else if(fpnode->Left == enode)
fpnode->Left = fnode;
else
fpnode->Right = fnode;
if(root.Left == enode)
root.Left = fnode->Isnil ? fpnode : MinNode(fnode);
if(root.Right == enode)
root.Right = fnode->Isnil ? fpnode : MaxNode(fnode);
}else{
enode->Left->Parent = pnode;
pnode->Left = enode->Left;
if(pnode == enode->Right)
fpnode = pnode;
else{
fpnode = pnode->Parent;
if(!fnode->Isnil)
fnode->Parent = fpnode;
fpnode->Left = fnode;
pnode->Right = enode->Right;
enode->Right->Parent = pnode;
}
if(root.Parent == enode)
root.Parent = pnode;
else if(enode->Parent->Left == enode)
enode->Parent->Left = pnode;
else
enode->Parent->Right = pnode;
pnode->Parent = enode->Parent;
SwapColor(pnode,enode);
}
if(enode->Color == Black){
for(;fnode!=root.Parent&&fnode->Color==Black;fpnode=fnode->Parent){
if(fnode == fpnode->Left){
pnode = fpnode->Right;
if(pnode->Color == Red){
pnode->Color = Black;
fpnode->Color = Red;
Lrotate(fpnode);
pnode = fpnode->Right;
}
if(pnode->Isnil)
fnode = fpnode;
else if(pnode->Left->Color==Black&&pnode->Right->Color==Black){
pnode->Color = Red;
fnode = fpnode;
}else{
if(pnode->Right->Color == Black){
pnode->Left->Color = Black;
pnode->Color = Red;
Rrotate(pnode);
pnode = fpnode->Right;
}
pnode->Color = fpnode->Color;
fpnode->Color = Black;
pnode->Right->Color = Black;
Lrotate(fpnode);
break;
}
}else{
pnode = fpnode->Left;
if(pnode->Color == Red){
pnode->Color = Black;
fpnode->Color = Red;
Rrotate(fpnode);
pnode = fpnode->Left;
}
if(pnode->Isnil)
fnode = fpnode;
else if(pnode->Right->Color==Black&& pnode->Left->Color==Black){
pnode->Color = Red;
fnode = fpnode;
}else{
if(pnode->Left->Color == Black){
pnode->Right->Color = Black;
pnode->Color = Red;
Lrotate(pnode);
pnode = fpnode->Left;
}
pnode->Color = fpnode->Color;
fpnode->Color = Black;
pnode->Left->Color = Black;
Rrotate(fpnode);
break;
}
}
}
fnode->Color = Black;
}
delete_node(enode);
if(0 < node_num)
--node_num;
return wnode;
}
Node* InsertFunc(char left, Node* wnode, Node* node){
Node *pnode;
++node_num;
node->Parent = wnode;
if(wnode == &root)
root.Left = root.Parent = root.Right = node;
else if(left){
wnode->Left = node;
if(wnode == root.Left)
root.Left = node;
}else{
wnode->Right = node;
if(wnode == root.Right)
root.Right = node;
}
for(pnode = node;pnode->Parent->Color == Red;){
if(pnode->Parent == pnode->Parent->Parent->Left){
wnode = pnode->Parent->Parent->Right;
if(wnode->Color == Red){
pnode->Parent->Color = Black;
wnode->Color = Black;
pnode->Parent->Parent->Color = Red;
pnode = pnode->Parent->Parent;
}else{
if(pnode == pnode->Parent->Right){
pnode = pnode->Parent;
Lrotate(pnode);
}
pnode->Parent->Color = Black;
pnode->Parent->Parent->Color = Red;
Rrotate(pnode->Parent->Parent);
}
}else{
wnode = pnode->Parent->Parent->Left;
if(wnode->Color == Red){
pnode->Parent->Color = Black;
wnode->Color = Black;
pnode->Parent->Parent->Color = Red;
pnode = pnode->Parent->Parent;
}else{
if(pnode == pnode->Parent->Left){
pnode = pnode->Parent;
Rrotate(pnode);
}
pnode->Parent->Color = Black;
pnode->Parent->Parent->Color = Red;
Lrotate(pnode->Parent->Parent);
}
}
}
root.Parent->Color = Black;
return node;
}
Node* insert(Node* node){
char Addleft = Left;
Node *tnode,*wnode,*pnode;
tnode = root.Parent;
wnode = &root;
while(!tnode->Isnil){
wnode = tnode;
if(node->first < tnode->first){
tnode = tnode->Left;
Addleft = Left;
}else{
tnode = tnode->Right;
Addleft = Right;
}
}
pnode = wnode;
if(!Addleft)
;
else if(pnode == root.Left)
return InsertFunc(Left,wnode,node);
else
pnode = PrevNode(wnode);
if(pnode->first < node->first)
return InsertFunc(Addleft,wnode,node);
return 0;
}
Node* lower_bound(lli key){
Node *pnode,*wnode;
pnode = root.Parent;
wnode = &root;
while(!pnode->Isnil){
if(pnode->first < key)
pnode = pnode->Right;
else{
wnode = pnode;
pnode = pnode->Left;
}
}
return wnode;
}
int main(){
Node *node,*bnode;
li n,i;
lli s,c,f,d;
scanf("%ld",&n);
for(i=0;i<n;i++){
scanf("%lld %lld",&s,&c);
node = lower_bound(s);
f = s;
if(node != root.Left){
bnode = PrevNode(node);
if(s-1 <= bnode->second){
f = bnode->first;
s = bnode->second + 1;
erase(bnode);
}
}
while(!node->Isnil){
d = node->first - s;
if(c > d){
c -= d;
s = node->second + 1;
bnode = node;
node = NextNode(node);
erase(bnode);
}else{
s += c - 1;
c = 0;
break;
}
}
if(c > 0)
s += c - 1;
printf("%lld\n",s);
if(!node->Isnil && s + 1 == node->first){
s = node->second;
erase(node);
}
insert(make_node(f,s));
}
return 0;
}
Submission Info
Compile Error
./Main.c: In function ‘main’:
./Main.c:374:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%ld",&n);
^
./Main.c:376:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld %lld",&s,&c);
^
Judge Result
| Set Name |
Sample |
Dataset1 |
Dataset2 |
Dataset3 |
| Score / Max Score |
0 / 0 |
35 / 35 |
40 / 40 |
25 / 25 |
| Status |
|
|
|
|
| Set Name |
Test Cases |
| Sample |
sample-01.txt, sample-02.txt, sample-03.txt |
| Dataset1 |
sample-01.txt, sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt |
| Dataset2 |
sample-01.txt, sample-02.txt, sample-03.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt |
| Dataset3 |
sample-01.txt, sample-02.txt, sample-03.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 03-05.txt, 03-06.txt, 03-07.txt, 03-08.txt, 03-09.txt, 03-10.txt, 03-11.txt, 03-12.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 01-01.txt |
AC |
55 ms |
796 KiB |
| 01-02.txt |
AC |
84 ms |
788 KiB |
| 01-03.txt |
AC |
107 ms |
1320 KiB |
| 01-04.txt |
AC |
85 ms |
3828 KiB |
| 01-05.txt |
AC |
24 ms |
696 KiB |
| 01-06.txt |
AC |
22 ms |
792 KiB |
| 01-07.txt |
AC |
24 ms |
792 KiB |
| 01-08.txt |
AC |
30 ms |
800 KiB |
| 01-09.txt |
AC |
87 ms |
1500 KiB |
| 02-01.txt |
AC |
25 ms |
792 KiB |
| 02-02.txt |
AC |
26 ms |
672 KiB |
| 02-03.txt |
AC |
24 ms |
800 KiB |
| 02-04.txt |
AC |
26 ms |
628 KiB |
| 02-05.txt |
AC |
25 ms |
792 KiB |
| 02-06.txt |
AC |
25 ms |
700 KiB |
| 02-07.txt |
AC |
24 ms |
708 KiB |
| 02-08.txt |
AC |
24 ms |
792 KiB |
| 02-09.txt |
AC |
25 ms |
796 KiB |
| 02-10.txt |
AC |
23 ms |
788 KiB |
| 02-11.txt |
AC |
24 ms |
700 KiB |
| 02-12.txt |
AC |
23 ms |
672 KiB |
| 03-01.txt |
AC |
133 ms |
700 KiB |
| 03-02.txt |
AC |
132 ms |
788 KiB |
| 03-03.txt |
AC |
123 ms |
672 KiB |
| 03-04.txt |
AC |
86 ms |
792 KiB |
| 03-05.txt |
AC |
156 ms |
6896 KiB |
| 03-06.txt |
AC |
120 ms |
796 KiB |
| 03-07.txt |
AC |
130 ms |
796 KiB |
| 03-08.txt |
AC |
166 ms |
6900 KiB |
| 03-09.txt |
AC |
166 ms |
6880 KiB |
| 03-10.txt |
AC |
36 ms |
800 KiB |
| 03-11.txt |
AC |
127 ms |
796 KiB |
| 03-12.txt |
AC |
127 ms |
676 KiB |
| sample-01.txt |
AC |
24 ms |
800 KiB |
| sample-02.txt |
AC |
23 ms |
796 KiB |
| sample-03.txt |
AC |
24 ms |
796 KiB |