#include <iostream> using namespace std; long long transform[500000][2]; long long tems,ucz; struct Node { long long data; struct Node* prev, *next; }; struct Node* getNode(long long data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->prev = newNode->next = NULL; return newNode; } bool is_higher(long long me, long long next){ long long diff = 0; for (long i = next+1; i <= me; i++) { diff = diff += transform[i][0] * transform[i][1]; } if (diff >= 0) return true; return false; } void sortedInsert(struct Node** head_ref, struct Node* newNode) { struct Node* current; if (*head_ref == NULL) { *head_ref = newNode; return; } if (!is_higher(newNode->data,(*head_ref)->data)) { newNode->next = *head_ref; newNode->next->prev = newNode; *head_ref = newNode; } else { current = *head_ref; while (current->next != NULL && is_higher(newNode->data, current->next->data)) current = current->next; newNode->next = current->next; if (current->next != NULL) newNode->next->prev = newNode; current->next = newNode; newNode->prev = current; } } void print(struct Node** head_ref){ struct Node* current = *head_ref; while (current->next != NULL) cout << current->data; } int main() { long long idx,val; cin >> tems >> ucz; long al[ucz]; for (long i=0; i<tems; i++) { cin >> val; al[i] = val; } struct Node* head = NULL; struct Node* new_node = getNode(0); sortedInsert(&head, new_node); for (long i = 1; i <= ucz; i++) { cin >> idx >> val; idx; transform[i][0] = idx; transform[i][1] = val - al[idx]; al[idx] = val; new_node = getNode(i); sortedInsert(&head, new_node); } print(&head); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <iostream> using namespace std; long long transform[500000][2]; long long tems,ucz; struct Node { long long data; struct Node* prev, *next; }; struct Node* getNode(long long data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->prev = newNode->next = NULL; return newNode; } bool is_higher(long long me, long long next){ long long diff = 0; for (long i = next+1; i <= me; i++) { diff = diff += transform[i][0] * transform[i][1]; } if (diff >= 0) return true; return false; } void sortedInsert(struct Node** head_ref, struct Node* newNode) { struct Node* current; if (*head_ref == NULL) { *head_ref = newNode; return; } if (!is_higher(newNode->data,(*head_ref)->data)) { newNode->next = *head_ref; newNode->next->prev = newNode; *head_ref = newNode; } else { current = *head_ref; while (current->next != NULL && is_higher(newNode->data, current->next->data)) current = current->next; newNode->next = current->next; if (current->next != NULL) newNode->next->prev = newNode; current->next = newNode; newNode->prev = current; } } void print(struct Node** head_ref){ struct Node* current = *head_ref; while (current->next != NULL) cout << current->data; } int main() { long long idx,val; cin >> tems >> ucz; long al[ucz]; for (long i=0; i<tems; i++) { cin >> val; al[i] = val; } struct Node* head = NULL; struct Node* new_node = getNode(0); sortedInsert(&head, new_node); for (long i = 1; i <= ucz; i++) { cin >> idx >> val; idx; transform[i][0] = idx; transform[i][1] = val - al[idx]; al[idx] = val; new_node = getNode(i); sortedInsert(&head, new_node); } print(&head); return 0; } |