Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- int gcd(int a, int b);
- //int* computelogs(int m);
- void query(int** st,int l, int r);
- int** build(int* arr, int n);
- int gcd(int a, int b){
- int tmp;
- while(b){
- tmp = a % b;
- a = b;
- b = tmp;
- }
- return a;
- }
- /*int* computelogs(int m){
- int nel=1<<m;
- int* lg=(int*)malloc(nel*sizeof(int));
- int i=1, j=0;
- lg[0]=0;
- lg[1]=0;
- while (i<m){
- while (j<(1<<i)){
- lg[j]=i-1;
- j+=1;
- }
- i+=1;
- }
- return lg;
- }*/
- void query(int** st,int l, int r){
- int j=log2(r-l+1);
- int v = gcd(st[l][j], st[r-(1<<j)+1][j]);
- printf("%d\n", v);
- }
- int** build(int* arr, int n){
- int m=log2(n)+1;
- int** st=(int**)malloc(n*sizeof(int*));
- for (int i=0; i<n; i++) st[i]=(int*)malloc(m*sizeof(int));
- int i=0;
- while (i<n){
- st[i][0]=arr[i];
- i+=1;
- }
- int j=1;
- while (j<m){
- i=0;
- while (i<=n-(1<<j)){
- st[i][j]=gcd(st[i][j-1], st[i+(1<<j-1)][j-1]);
- i+=1;
- }
- j+=1;
- }
- return st;
- }
- int main (int argc, char** argv){
- int m, n;
- scanf("%d", &n);
- int* arr=(int*)malloc(n*sizeof(int));
- for (int i=0; i<n; i++) scanf("%d", &arr[i]);
- for (int i=0; i<n; i++) arr[i] = abs(arr[i]);
- scanf("%d", &m);
- //int* lg = computelogs(n);
- int** st = build(arr, n);
- for (int i=0; i<m; i++){
- int l, r;
- scanf("%d%d", &l, &r);
- query(st, l, r);
- }
- free(arr);
- for (int i=0; i<n; i++) free(st[i]);
- free(st);
- //free(lg);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement