Below given code is for implementing binary indexed tree or BIT for range sum and point updates.
for Further details you can read HERE
// © NISHANT RAJ // source :-> http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees // created :-> 23 / 03 / 2014 ; 04 : 36 #include <cstdio> #include <cstdlib> #include <iostream> #include <map> #include <string> #include <cstring> #include <sstream> #include <fstream> #include <climits> #include <ctime> #include <algorithm> #include <bits/stdc++.h> using namespace std; int a[100000],cum[100000],res[100000],maxval; int get_value(int idx) // reading cumulative frequency of index idx O(log(maxval)). { int sum=0; while(idx>0) { sum+=res[idx]; idx-=(idx & -idx); } return sum; } void update(int idx,int val)// updating frequency range { while(idx<=maxval) { res[idx]+=val; idx+=(idx & -idx); } } int main() { int t; cin>>t; while(t--) { int j,idx,val,k; cin>>maxval; cum[0]=0; for(int i=1;i<=maxval;i++) { cin>>a[i]; //actual frequency given by user. cum[i]+=a[i]+cum[i-1];// cumulative frequency array. } for(int i=1;i<=maxval;i++) { j= i + 1 - (1<<(__lg(i & -i)));// __lg(num) ->calculates //the position of MSB res[i]=cum[i] - cum[j-1];// calcualting frequency of particular range } int qury; cin>>qury; string in,upd="U",find="S"; while(qury--) { cin>>in; if(in==upd) { cin>>idx>>val; update(idx,val); // takes O(log(maxval)) time. } if(in==find) { cin>>j>>k; // takes 2*O(log(maxval)) time. cout<<(get_value(k) - get_value(j-1))<<endl; } } } return 0; }
No comments:
Post a Comment
Your comment is valuable to us