Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int const N = 1234567;
- int const T = 1000000001;
- pair<int, int> st[N];
- int a[N];
- struct node {
- node *left;
- node *right;
- int value;
- node() : left(0), right(0), value(0) {}
- };
- void clear(node *v) {
- if (!v) return;
- clear(v->left);
- clear(v->right);
- delete v;
- }
- int inc(node *v, int left, int right, int x, int value) {
- if (left >= right - 1) {
- v->value++;
- if (v->value == value) {
- v->value = 0;
- return false;
- }
- return true;
- }
- int mid = (left + right) >> 1;
- if (x < mid) {
- if (!v->left) {
- v->left = new node();
- }
- clear(v->right);
- v->right = 0;
- return inc(v->left, left, mid, x, value);
- } else {
- if (!v->right) {
- v->right = new node();
- }
- return inc(v->right, mid, right, x, value);
- }
- }
- int main() {
- int n;
- scanf("%d", &n);
- for (int i = 0; i < n; i++) scanf("%d", a + i);
- bool is_one = true;
- for (int i = 1; i < n; i++) is_one &= a[i] > a[i - 1];
- if (is_one) {
- puts("1");
- return 0;
- }
- int l = 1;
- int r = n;
- while (l < r - 1) {
- int mid = (l + r) >> 1;
- bool bad = false;
- node *root = new node();
- for (int i = 1; i < n; i++) {
- if (a[i] <= a[i - 1]) {
- int x = a[i] - 1;
- while (x >= 0 && !inc(root, 0, T, x, mid)) {
- --x;
- }
- if (x < 0) {
- bad = true;
- break;
- }
- }
- }
- clear(root);
- if (bad) {
- l = mid;
- } else {
- r = mid;
- }
- }
- printf("%d\n", r);
- }
Advertisement
Add Comment
Please, Sign In to add comment