Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //19
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- void sparsetable_Build(int * arr, int n, int * lg, int ** array)
- {
- int m = lg[n] + 1, i = 0, j = 1;
- while(i < n){
- array[i][0] = arr[i];
- i++;
- }
- while(j < m){
- i = 0;
- while(i <= n- (1 << j)){
- array[i][j] = GCD(array[i][j - 1], array[i + (1 << (j - 1))][j - 1]);
- i++;
- }
- j++;
- }
- }
- int computelLogarithms(int m)
- {
- int *lg = malloc((1 << m) * sizeof(int));
- int i = 1, j = 0;
- while(i <= m){
- while(j < (1 << i)){
- lg[j] = i - 1;
- j++;
- }
- i++;
- }
- return lg;
- }
- int sparseTable_Query(int ** array, int l, int r, int * lg)
- {
- int j = lg[r - l + 1];
- return GCD(array[l][j], array[r - (1<<j) + 1][j]);
- }
- int GCD(int a, int b)
- {
- if (b == 0)
- return a;
- else
- return GCD(b, a % b);
- }
- void kill(int *array1)
- {
- free(array1);
- }
- int main()
- {
- int n, times, l, r;
- scanf("%d", &n);
- int *arr = malloc(n * sizeof(int));
- int **array = malloc(n * sizeof (int *));
- int x = log2(n) + 1;
- for (int i = 0; i < n; i++){
- scanf("%d", &arr[i]);
- }
- for (int i = 0; i < n; i++){
- array[i] = malloc(x * sizeof(int));
- }
- int array1 = computelLogarithms(x);
- sparsetable_Build(arr, n, array1, array);
- scanf("%d", ×);
- for (; times > 0; times--){
- scanf("%d %d", &l, &r);
- printf("%d \n", abs(sparseTable_Query(array, l, r, array1)));
- }
- for (int i = 0; i < n; i++){
- free(array[i]);
- }
- free (arr);
- free (array);
- kill(array1);
- }
- //19
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define PEAK "PEAK"
- int peak (int *arr, int i,int j, int n)
- {
- int count = 0;
- if (n == 1){
- return 1;
- }
- while (i<=j) {
- if (((i == 0) && (arr[i] >= arr[i + 1])) || ((i == n - 1) && (arr[i] >= arr[i - 1]))) {
- count++;
- }
- if (i != 0 && i != n - 1 && arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i]) {
- count++;
- }
- i++;
- }
- return count;
- }
- int query(int l, int r, int i, int a, int b, int *T)
- {
- if (l == a && r == b){
- return T[i];
- }else{
- int m = (a+b)/2;
- if (r <= m){
- return query(l, r, 2*i+1, a, m, T);
- }else{
- if (l > m){
- return query(l, r, 2*i+2, m+1, b, T);
- }else{
- return query(m+1, r, 2*i+2, m+1, b, T) + query(l, m, 2*i+1, a, m, T);
- }
- }
- }
- }
- void build(int *arr, int i, int n, int a, int b, int *T)
- {
- if (a == b) {
- T[i] = peak(arr, a, b, n);
- }else{
- int m = (a+b)/2;
- build(arr, 2*i + 1, n, a, m, T);
- build(arr, 2*i + 2, n, m+1, b, T);
- T[i] = T[2*i + 2] + T[2*i+1];
- }
- }
- void update(int *arr, int j, int val, int i, int a, int b, int *T, int n)
- {
- if (a == b)
- T[i] = peak(arr, a, b, n);
- else {
- int m = (a+b)/2;
- if (j <= m) {
- update(arr, j, val, 2*i+1, a, m, T, n);
- }else{
- update(arr, j, val, 2*i+2, m+1, b, T, n);
- }
- T[i] = T[2*i + 2] + T[2*i+1];
- }
- }
- int main()
- {
- int n, l, r, times;
- scanf("%d", &n);
- int *arr = malloc(n * sizeof(int));
- int *T = calloc(4*n, sizeof(int));
- for (int i = 0; i < n; i++){
- scanf("%d", &arr[i]);
- }
- build (arr, 0, n, 0, n-1, T);
- scanf("%d", ×);
- char s[5];
- for (int i = 0; i < times; i++) {
- scanf("%s", &s);
- if (strcmp(s, PEAK) == 0) {
- scanf("%d%d", &l, &r);
- printf ("%d\n", query(l, r, 0, 0, n-1, T));
- }else{
- scanf("%d%d", &l, &r);
- arr[l] = r;
- update(arr, l, r, 0, 0, n-1, T, n);
- if (l!=0) update(arr, l-1, r, 0, 0, n-1, T, n);
- if (l!=n-1) update(arr, l+1, r, 0, 0, n-1, T, n);
- }
- }
- free(arr);
- free(T);
- }
- //17
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX "MAX"
- int query(int l, int r, int i, int a, int b, int *T)
- {
- int m = 0;
- if (l == a && r == b){
- return T[i];
- }else{
- m = (a+b)/2;
- if (r <= m){
- return query(l, r, 2*i+1, a, m, T);
- }
- if (l > m){
- return query(l, r, 2*i+2, m+1, b, T);
- }
- if (query(l, m, 2*i+1, a, m, T) > query(m + 1, r, 2*i+2, m + 1, b, T)){
- return query(l, m, 2*i+1, a, m, T);
- }else{
- return query(m + 1, r, 2*i+2, m + 1, b, T);
- }
- }
- }
- void build(int *arr, int i, int a, int b, int *T)
- {
- if (a == b) {
- T[i] = arr[a];
- }else{
- int m = (a+b)/2;
- build(arr, 2*i + 1, a, m, T);
- build(arr, 2*i + 2, m+1, b, T);
- if(T[2*i + 1] > T[2*i + 2]){
- T[i] = T[2*i + 1];
- }else{
- T[i] = T[2*i + 2];
- }
- }
- }
- void update(int j, int val, int i, int a, int b, int *T)
- {
- int m = 0;
- if (a == b)
- T[i] = val;
- else {
- m = (a+b)/2;
- if (j <= m) {
- update(j, val, 2*i+1, a, m, T);
- }else{
- update(j, val, 2*i+2,m+1, b, T);
- }
- if(T[2*i + 1] > T[2*i + 2]){
- T[i] = T[2*i + 1];
- }else{
- T[i] = T[2*i + 2];
- }
- }
- }
- int main()
- {
- int n, l, r, times;
- scanf("%d", &n);
- int *arr = malloc(n * sizeof(int));
- int *T = malloc(4*n * sizeof(int));
- for (int i = 0; i < n; i++){
- scanf("%d", &arr[i]);
- }
- build(arr, 0, 0, n-1, T);
- scanf("%d", ×);
- char s[4];
- for (int i = 0; i < times; i++) {
- scanf("%s", s);
- if (strcmp(s, MAX) == 0) {
- scanf("%d %d", &l, &r);
- printf ("%d\n", query(l, r, 0, 0, n-1, T));
- }else{
- scanf("%d %d", &l, &r);
- update(l, r, 0, 0, n-1, T);
- }
- }
- free(arr);
- free(T);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement