এখানে, আমাদের আকার n-এর একটি অ্যারে দেওয়া আছে যা প্রাথমিকভাবে সমস্ত উপাদান ০ دارد। এবং কিছু কোয়েরি রয়েছে যা এই עלটি কাজে লাগাতে হবে। দুটি ধরনের কোয়েরি রয়েছে -
update(l,r, value) - অ্যারে के那些 इন্ডেক্স l থেকে r পর্যন্ত value যোগ করুন। উদাহরণস্বরূপ, update(2, 4, 5) অ্যারেটি আপডেট করবে ২ নম্বর উপাদানটি ৪ এবং ৫ নম্বর ইনডেক্সে রাখবে।
getRangeSum(l, r) - l থেকে r পর্যন্ত উপাদানগুলির যোগফল খুঁজুন। উদাহরণস্বরূপ, getRangeSum(4, 7) ৪, ৫, ৬, ৭ ইনডেক্সের সমস্ত উপাদানের যোগফল খুঁজে বের করবে।
একটি উদাহরণ নিয়ে সমস্যাটি বুঝি,
ইনপুট
n = 7 , arr[7] = {0,0,0,0,0,0,0} Q1 = update(3, 6, 4) Q2 = update(0, 4, 2) Q3 = Sum(2, 5)
আউটপুট
10
ব্যাখ্যা
কোয়েরি সমাধান: Q1 - update(3, 6, 4) = {0, 0, 0, 4, 4, 4, 4} Q2 - update(0, 4, 2) = {2, 2, 2, 2, 2, 4, 4} Q3 - sum(2, 5) = 2+2+2+4 = 10
এই সমস্যাটি সমাধান করার একটি সহজ পদ্ধতি হবে প্রতিটি আপডেট কোয়েরিতে অ্যারে আপডেট করা এবং তারপর যোগফল খুঁজে বের করা কিন্তু এটি saa فعال নয় তাই একটি আরও কার্যকর পদ্ধতি শিখি।
আপডেট কোয়েরিগুলোর যোগ কোয়েরির ওপর প্রভাব দেখা যাক। যোগ কোয়েরি sum[l,r] আকারের, আমরা এটি sum[0,k] আকারের যোগ কোয়েরিতে ভাগ করব এবং তারপর নিম্ন সীমার যোগফলকে নিম্ন সীমার যোগফল থেকে বিয়োগ করব।
sum[l,r] = sum[0,r] - sum[0,l]
তবে, sum[0,k]-এর প্রভাব sum[l,r]-এ প্রতিফলিত হবে। যোগ ভেরিয়েবল k তিনটি ভিন্ন অঞ্চলে থাকবে তার আপেক্ষিক মান এবং আপডেট কোয়েরির [l,r] রেঞ্জের উপর ভিত্তি করে।
অঞ্চল ১ - k ০ এবং l-এর মধ্যে থাকে অর্থাৎ 0 < k < l
এই ক্ষেত্রে, আপডেট কোয়েরি যোগ কোয়েরিকে প্রভাবিত করবে না।
অঞ্চল ২ - k l এবং r-এর মধ্যে থাকে অর্থাৎ l ≤ k ≤ r
এই ক্ষেত্রে, যোগ কোয়েরি l থেকে k পর্যন্ত মান বিনিয়োগ করবে।
অঞ্চল ৩ - k r-এর চেয়ে বড় অর্থাৎ k > r
এই ক্ষেত্রে, যোগ কোয়েরি l থেকে r পর্যন্ত সমস্ত মান বিনিয়োগ করবে।
এখন, রেঞ্জ আপডেট এবং রেঞ্জ কোয়েরি সমাধান করার প্রোগ্রামটি দেখি
// রেঞ্জ আপডেট এবং রেঞ্জ কোয়েরি সমাধান করার প্রোগ্রাম
উদাহরণ
#include <bits/stdc++.h> using namespace std; int getSum(int BITree[], int i){ int sum = 0; i++; while (i>0) { sum += BITree[i]; i -= i & (-i); } return sum; } void updateBITree(int BITree[], int n, int i, int val) { i = i + 1; while (i <= n) { BITree[i] += val; i += i & (-i); } } void update(int BITTree1[], int BITTree2[], int n, int l, int r, int value) { updateBITree(BITTree1,n,l,value); updateBITree(BITTree1,n,r+1,-value); updateBITree(BITTree2,n,l,value*(l-1)); updateBITree(BITTree2,n,r+1,-value*r); } int sum(int x, int BITTree1[], int BITTree2[]) { return (getSum(BITTree1, x) * x) - getSum(BITTree2, x); } int getRangeSum(int l, int r, int BITTree1[], int BITTree2[]) { return sum(r, BITTree1, BITTree2) - sum(l-1, BITTree1, BITTree2); } int *createBITree(int n) { int *BITree = new int[n+1]; for (int i=1; i<=n; i++) BITree[i] = 0; return BITree; } int main(){ int n = 7; int *BITTree1, *BITTree2; BITTree1 = createBITree(n); BITTree2 = createBITree(n); update(BITTree1,BITTree2,n,3,6,9); update(BITTree1,BITTree2,n, 0, 4, 5); cout<<"সকল আপডেট কোয়েরি প্রয়োগের পর যোগ কোয়েরির আউটপুট \t" <<getRangeSum(1,5,BITTree1,BITTree2); return 0; }
আউটপুট
সকল আপডেট কোয়েরি প্রয়োগের পর যোগ কোয়েরির আউটপুট