自己的代码超时了,看到题解要使用线段树,不会。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <stdio.h>
int maxFun(int a, int b)
{
return a>b?a:b;
}
int gcd(int a,int b)
{
int temp;
if(a<b) //用a来存大数
{
temp=a;
a=b;
b=temp;
}
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
using namespace std;
void printv(vector<int> b)
{
for(int i=0;i<b.size();i++)
{
cout << b[i] << " ";
}
cout << endl;
}
int main()
{
int n, m;
while(scanf("%d %d",&n, &m) != EOF)
{
vector<int> b;
for(int i =0;i<n;i++)
{
int temp;
scanf("%d", &temp);
b.push_back(temp);
}
for(int i =0;i<m;i++)
{
int choice;
scanf("%d", &choice);
if(1 == choice)
{
int l, r;
scanf("%d %d", &l, &r);
int x;
scanf("%d", &x);
l--;r--;
for(int j = l;j<=r;j++)
{
b[j] += x;
}
}
else if(2 == choice)
{
int l, r;
scanf("%d %d", &l, &r);
l--;r--;
if(l == r)
{
printf("%d\n", 0);continue;
}
int maxsub = -1;
for(int j = l+1;j<=r;j++)
{
maxsub = maxFun(maxsub, abs(b[j]-b[j-1]));
}
printf("%d\n", maxsub);
}
else if(3 == choice)
{
int l, r;
scanf("%d %d", &l, &r);
l--;r--;
vector<int> tmp;
for(int j = r;j>=l;j--)
{
tmp.push_back(b[j]);
}
if(tmp.size() == 1)
{
printf("%d\n", tmp[0]);
continue;
}
else if(tmp.size() == 2)
{
printf("%d\n", gcd(tmp[0], tmp[1]));
continue;
}
int gcdval = gcd(tmp[0], tmp[1]);
for(int j = 2;j<tmp.size();j++)
{
gcdval = gcd(gcdval, tmp[j]);
}
printf("%d\n", gcdval);
}
}
}
return 0;
}