本题我无耻地用了暴力枚举的方法水过去的。。网上一搜全是线段树的解法,可惜不会啊。。等以后学会了再用之
#include<stdio.h>
int main()
{
int n, m, a[30001];
while (scanf("%d %d", &n, &m) != EOF)
{
long long ori = 0, sum = 0;
int i, j;
for (i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
ori += a[i];
}
sum = ori;
int begin, end, total;
long long part, avr;
for (i = 0; i < m; i++)
{
scanf("%d %d", &begin, &end);
part = 0;
for (j = begin; j <= end; j++)
part += a[j];
total = end - begin + 1;
avr = part / total;
if (part % total)
{
if (sum <= ori && part > 0)
avr++;
else if (sum > ori && part < 0)
avr--;
}
for (j = begin; j <= end; j++)
a[j] = avr;
sum = sum - part + avr * total;
}
for (i = 1; i < n; i++)
printf("%d ", a[i]);
printf("%d\n\n", a[n]);
}
return 0;
}