Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <string.h>
- #include <limits.h>
- int max(int x, int y)
- {
- return x <= y ? y : x;
- }
- int min(int x, int y)
- {
- return x <= y ? x : y;
- }
- int ints_get(int *a)
- {
- int result = 0;
- int x;
- while (scanf("%d", &x) != EOF)
- a[result++] = x;
- return result;
- }
- int ints_get_while_not(int *a, int z)
- {
- int result = 0;
- int x;
- while (scanf("%d", &x) != EOF && x != z)
- a[result++] = x;
- return result;
- }
- int ints_get_two(int *a, int *b)
- {
- int result = 0;
- int x, y;
- while (scanf("%d%d", &x, &y) != EOF)
- {
- a[result] = x;
- b[result] = y;
- result++;
- }
- return result;
- }
- int ints_init(int x, int n, int *a)
- {
- int result = 0;
- for (int i = 0; i < n; i++)
- a[result++] = x;
- return result;
- }
- int ints_id(int n, int *a)
- {
- int result = 0;
- for (int i = 0; i < n; i++)
- a[result++] = i;
- return result;
- }
- int ints_count(const int *a, int n, int x)
- {
- int result = 0;
- for (int i = 0; i < n; i++)
- if (a[i] == x)
- result++;
- return result;
- }
- int ints_sum(const int *a, int n)
- {
- int result = 0;
- for (int i = 0; i < n; i++)
- result += a[i];
- return result;
- }
- int ints_find(const int *a, int n, int x)
- {
- for (int i = 0; i < n; i++)
- if (a[i] == x)
- return i;
- return -1;
- }
- int ints_max(const int *a, int n)
- {
- int result = INT_MIN;
- for (int i = 0; i < n; i++)
- if (result < a[i])
- result = a[i];
- return result;
- }
- int ints_min(const int *a, int n)
- {
- int result = INT_MAX;
- for (int i = 0; i < n; i++)
- if (result > a[i])
- result = a[i];
- return result;
- }
- int ints_argmax(const int *a, int n)
- {
- int result = -1;
- int max = INT_MIN;
- for (int i = 0; i < n; i++)
- if (max < a[i])
- {
- max = a[i];
- result = i;
- }
- return result;
- }
- int ints_argsmax(const int *a, int n, int *b)
- {
- int result = 0;
- int max = INT_MIN;
- for (int i = 0; i < n; i++)
- {
- if (max < a[i])
- {
- max = a[i];
- result = 0;
- }
- if (max <= a[i])
- b[result++] = i;
- }
- return result;
- }
- void ints_println_basic(const int *a, int n)
- {
- if (n > 0)
- {
- printf("%d", a[0]);
- for (int i = 1; i < n; i++) // i = 1
- printf(" %d", a[i]);
- }
- printf("\n");
- }
- void ints_println_basic_two(const int *a, const int *b, int n)
- {
- assert(n > 0);
- for (int i = 0; i < n; i++)
- printf("%d %d\n", a[i], b[i]);
- }
- void ints_print(int *a, int n, char *separator)
- {
- if (n > 0)
- {
- printf("%d", a[0]);
- for (int i = 1; i < n; i++) // i = 1
- printf("%s%d", separator, a[i]);
- }
- }
- void ints_println(int *a, int n, char *separator)
- {
- ints_print(a, n, separator);
- printf("\n");
- }
- int *ints_new (int n)
- {
- return (int *) malloc (n * sizeof(int));
- }
- //---------------------
- int ints_is_sorted(int *a, int n)
- {
- for (int i = 1; i < n; i++)
- if (a[i-1] > a[i])
- return 0;
- return 1;
- }
- int ints_rank(const int *a, int n, int x)
- {
- int result = 0;
- while (n > 0)
- {
- int m = n / 2;
- if (x <= a[m])
- n = m;
- else
- {
- result += m+1;
- a += m+1;
- n -= m+1;
- }
- }
- return result;
- }
- int ints_bfind(const int *a, int n, int x)
- {
- int r = ints_rank(a, n, x);
- return r < n && a[r] == x ? r : -1;
- }
- int ints_bfind_classic(const int *a, int n, int x)
- {
- int i = 0;
- int j = n-1;
- while (i <= j)
- {
- int m = i + (j-i) / 2;
- if (x < a[m])
- j = m-1;
- else if (x > a[m])
- i = m+1;
- else
- return m;
- }
- return -1;
- }
- //-------------------
- void ints_exchange(int *a, int x, int y)
- {
- int m = a[x];
- a[x] = a[y];
- a[y] = m;
- }
- void ints_sort_last(int *a, int n)
- {
- int i = n-1;
- while (i > 0 && a[i-1] > a[i])
- {
- ints_exchange(a, i-1, i);
- i--;
- }
- }
- int ints_insert(int *a, int n, int x)
- {
- int result = n;
- a[result++] = x;
- ints_sort_last(a, result);
- return result;
- }
- void ints_isort(int *a, int n)
- {
- for (int i = 2; i <= n; i++)
- ints_sort_last(a, i);
- }
- int ints_copy(const int *a, int n, int *b)
- {
- if (n < 0)
- n = 0;
- memmove(b, a, n * sizeof(int)); // Note: 3rd arg is unsigned.
- return n;
- }
- int ints_merge(const int *a, int n, const int *b, int m, int *c)
- {
- int result = 0;
- int i = 0;
- int j = 0;
- while (i < n && j < m)
- if (a[i] <= b[j])
- c[result++] = a[i++];
- else
- c[result++] = b[j++];
- result += ints_copy(a + i, n - i, c+result);
- result += ints_copy(b + j, m - j, c+result);
- return result;
- }
- void ints_msort_i(int *a, int n, int *b)
- {
- if (n > 1)
- {
- int m = n / 2;
- ints_msort_i(a, m, b);
- ints_msort_i(a+m, n-m, b);
- ints_merge(a, m, a+m, n-m, b);
- ints_copy(b, n, a);
- }
- }
- void ints_msort(int *a, int n)
- {
- int *b = ints_new(n);
- ints_msort_i(a, n, b);
- }
- // -----------------
- int get_rising_group (int *a, int n)
- {
- int x=0;
- while ((x<=n)&&(a[x]<= a[x+1]))
- x++;
- return x+1;
- }
- void tending (int *a, int n)
- {
- int result [100000];
- int k=0;
- int x=0;
- int msize=0;
- while (x<n)
- {
- k=get_rising_group (a+x, n);
- result[k-1]=result[k-1]+1;
- x=x+k;
- if (k>msize)
- msize=k;
- }
- ints_println_basic(result, msize);
- }
- int main()
- {
- int data[100000];
- int n= ints_get(data);
- tending (data, n);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement