C/C++

Задача . Знакопеременная сумма

Всем привет. Есть вот такая задача. Я ее закодил на питон на 12 из 36 баллов. Есть кто сможет написать на С++ или python на все тесты. Заранее благодарю, если поможите!


[префиксные суммы]
Знакопеременной суммой последовательности чисел a_1,a_2,\ldots,a_ka1​,a2​,…,ak​ называется результат вычисления выражения a_1-a_2+a_3-a_4+a_5-\ldots+(-1)^{k+1}a_ka1​−a2​+a3​−a4​+a5​−…+(−1)k+1ak​. Другими словами, мы складываем все числа в последовательности, но элементы с нечетными номерами мы берем со знаком плюс, а четные — со знаком минус. 
Задан массив x_1,x_2,\ldots,x_nx1​,x2​,…,xn​ из nn целых чисел и mm запросов. Каждый запрос содержит по два натуральных числа bb и ee. В ответ на каждый запрос ваша программа должна взять подмассив с номерами элементов от bb до ee включительно и посчитать его знакопеременную сумму x_b-x_{b+1}+x_{b+2}-x_{b+3}+\ldots+(-1)^{e-b}x_exb​−xb+1​+xb+2​−xb+3​+…+(−1)e−bxe​
Формат входных данных
На вход в первой строке подается одно натуральное число nn — размер массива чисел, 1\le n \le 10^51≤n≤105. Во второй строке  через пробел записаны элемент массива — целые числа x_1,x_2,\ldots x_nx1​,x2​,…xn​. Каждое из чисел не превосходит 10^6106 по абсолютной величине. Далее в третьей строке записано одно натуральное число  mm — количество запросов, 1\le m \le 10^51≤m≤105. В каждой из mm последующих строк записано по два числа b_ibi​ и e_iei​ таких, что 1\le b_i\le e_i\le n1≤bi​≤ei​≤n. Каждая пара чисел задает границы подмассива для выполнения одного запроса. 
Формат выходных данных
Требуется вывести через пробел mm целых чисел s_1,\ldots s_ms1​,…sm​. Каждое из чисел должно быть равно знакопеременной сумме соответствующего подмассива.
Если вы программируете на Python, то убрать перенос строки в функции print можно при помощи именованного параметра end, например, print(a,end=' ').
Методика проверки
Программа проверяется на 32 тестах. Прохождение каждого теста оценивается в 1 балл.  Тест из условия задачи при проверке не используется. В первых 12 тестах размер массива и количество запросов не превосходят 1000.
Sample Input 1:
5
7 -4 1 3 2
4
2 2
1 3
2 4
4 5
Sample Output 1:
-4 12 -2 1
Пояснение к примеру
Для каждого из запросов ответ получается следующим образом: 
-4=-4−4=−4; 
7-(-4)+1=127−(−4)+1=12
-4-1+3=-2−4−1+3=−2
3-2=13−2=1
 #include  
#include

using namespace std;

typedef long long ll;

int main(){
int n, m, l, r;
ll res;
cin >> n;
vector a(n), d(n, 0);
for(int i = 0; i < n; i++){
cin >> a[i];
if(i < 2) d[i] = a[i];
else d[i] = d[i - 2] + a[i];
}
cin >> m;
while(m--){
cin >> l >> r;
l--;
r--;
if(l % 2 == r % 2){
res = d[r];
if(r - 1 >= 0) res -= d[r - 1];
if(l - 1 >= 0) res += d[l - 1];
if(l - 2 >= 0) res -= d[l - 2];
}
else{
res = d[r - 1] - d[r];
if(l - 1 >= 0) res += d[l - 1];
if(l - 2 >= 0) res -= d[l - 2];
}
cout
АП
Алексей Пилипенко
12 614
Лучший ответ
Рустем Мамедиев Много ифов )
 #include 
#include
using namespace std;

int main()
{
uint32_t size, counts;
int32_t sum{}, result;
cin >> size; //input nn
vector arr(size);
for (auto& i : arr) cin >> i; //input elem
cin >> counts; //input mm
vector requests(counts);
for (auto& i : requests)
{
cin >> i.first >> i.second; --i.first; --i.second;
}//input requests
vector summs(size); //в принципе можно обойтись без arr, сразу заполняя сумм.
for (int i = 0; i < size; i++) summs[i] = sum += i & 1 ? -arr[i] : arr[i]; //summing
for (auto& i : requests)
{
result = ((i.first ? summs[i.first - 1] : 0) - summs[i.second]) * (i.first & 1 ? 1 : -1);
cout
Используй дерево отрезков или sqrt-декомпозицию. Это откуда задача?
Алексей Пилипенко набор данных постоянен - тут обычных префсумм спокойно хватит )
Круто, good luck proebat` vremya