โจทย์
กำหนดอาร์เรย์ arr[m], ค่า n ที่จะบวก, และ r queries แต่ละ query มี start และ end index สำหรับแต่ละ query ให้บวก n เข้าไปในอาร์เรย์ตั้งแต่ start ถึง end แล้วพิมพ์อาร์เรย์หลังแต่ละ query
ตัวอย่าง
Input: arr = {1, 2, 3, 4, 5}, n = 2
Queries: {0, 3}, {1, 2}
Query 1: เพิ่ม 2 ที่ index 0-3 → {3, 4, 5, 6, 5}
Query 2: เพิ่ม 2 ที่ index 1-2 → {3, 6, 7, 6, 5}อัลกอริทึม (Naive Approach)
- สร้าง struct range {int start, end;}
- ฟังก์ชัน add_tomatrix(arr, queries, n, size, m):
- วนลูปทุก query i = 0..m-1
- วนลูป j = queries[i].start ถึง queries[i].end: arr[j] += n
- พิมพ์อาร์เรย์ทั้งหมดหลัง query นั้น
โค้ดภาษา C
#include <stdio.h>
struct range {
int start, end;
};
int add_tomatrix(int arr[], struct range r[], int n, int size, int m) {
int i, j, k;
for (i = 0; i < m; i++) {
for (j = r[i].start; j <= r[i].end; j++)
arr[j] += n;
printf("Query %d: ", i + 1);
for (k = 0; k < size; k++)
printf(" %d", arr[k]);
printf("\n");
}
return 0;
}
int main() {
int arr[] = {3, 4, 8, 1, 10};
struct range r[] = {{0, 2}, {1, 3}, {3, 4}};
int n = 2;
int size = sizeof(arr) / sizeof(arr[0]);
int m = sizeof(r) / sizeof(r[0]);
add_tomatrix(arr, r, n, size, m);
return 0;
}ผลลัพธ์
Query 1: 5 6 10 1 10 Query 2: 5 8 12 3 10 Query 3: 5 8 12 5 12
หมายเหตุ: วิธีนี้ใช้เวลา O(m × n) สำหรับ m queries และ n ขนาดอาร์เรย์ สามารถปรับปรุงได้ด้วย Difference Array / Prefix Sum ให้เป็น O(m + n)