Suppose given array is a[0..N-1],
Define s[k]=a[0]+a[1]+...+a[k], k=0..N-1
The problem asks to implement 2 operations:
1) increase a[p],a[p+1]..a[q] by v
2) query a[p]+a[p+1]+..+a[q]

Define array b[0..N-1] and sb[0..N-1]:
b[0] = a[0],
b[k] = a[k] - a[k-1] for k>0,
sb[k] = b[0]+b[1]+..+b[k].
Then a[k] = b[0] + b[1] + .. + b[k]
     s[k] = b[0] + (b[0]+b[1]) + .. + (b[0]+b[1]+..+b[k])
          = (k+1)b[0] + k*b[1] + .. + b[k]
          = (k+1)(b[0]+b[1]+..+b[k]) - (0*b[0]+1*b[1]+..+k*b[k])

Define c[k] = k * b[k] for k=0..N-1, and sc[k] = c[0]+c[1]+..+c[k].
Then s[k] = (k+1)*sb[k] - sc[k]

(b[k],sb[k]) and (c[k],sc[k]) can be maintained by 2 BITs
1) is archived by updating b[p], b[q+1], c[p] and c[q+1]
2) can be easily computed after query sb[k] and sc[k] (k=p-1,q)


2013/3/13 Aman Jain <[email protected]>

> Here in this code given below,
> Horrible is solved using 2 BIT(binary indexed trees)
> Can Someone please explain the Logic of the program or suggest other way
> to do the same ques using BIT
> problem here coming is here range query and range updation both
> simultaneously which is difficult with BIT.
> #include <cstdio>
> #include <cstring>
>
> using namespace std;
>
> long long bit1[100002],bit2[100002];
>
> void update(long long bit[], int idx, long long val){
>     for(int x = idx;x <= 100001;x += x & -x)
>         bit[x] += val;
> }
>
> long long query(long long bit[], int idx){
>     long long ret = 0;
>
>     for(int x = idx;x > 0;x -= x & -x)
>         ret += bit[x];
>
>     return ret;
> }
>
> int main(){
>     int T,N,Q;
>
>     scanf("%d",&T);
>
>     while(T--){
>         scanf("%d %d",&N,&Q);
>
>         memset(bit1,0,sizeof bit1);
>         memset(bit2,0,sizeof bit2);
>
>         for(int i = 0,op,l,r,v;i < Q;++i){
>             scanf("%d %d %d",&op,&l,&r);
>
>             if(op == 0){
>                 scanf("%d",&v);
>
>                 update(bit1,l,v); update(bit1,r + 1,-v);
>                 update(bit2,l,-(long long)v * (l - 1)); update(bit2,r +
> 1,(long long)v * r);
>             }else{
>                 printf("%lld\n",query(bit1,r) * r + query(bit2,r) -
> query(bit1,l - 1) * (l - 1) - query(bit2,l - 1));
>             }
>         }
>     }
>
>      return 0;
> }
>
>
> On Tue, Feb 26, 2013 at 3:13 PM, dheeraj hasija <
> [email protected]> wrote:
>
>> you can have this code for better understanding
>>
>> #include<stdio.h>
>>
>> long long   v[500000];
>> long long   a[500000];
>>
>>
>> inline long long getvalue( int index, int low, int high)
>> {
>>        return a[index] + (high-low+1)*v[index];
>> }
>>
>> long long update( long long index, long long down, long long up, long
>> long low, long long high,long long value)
>> {
>>     long long mid = (low+high)/2;
>>
>>
>>
>>     if(  down <= low && high <= up)
>>     {v[index] += value;
>>
>>     return 0;
>>     }
>>
>>     if(low> up || high < down)
>>     return 0;
>>
>>     v[2*index] += v[index];
>>     v[2*index+1] += v[index];
>>     v[index]  = 0;
>>
>>     update( 2*index, down,up, low,mid,value);
>>     update(2*index+1 , down,up, mid+1, high,value);
>>
>>
>>
>>     a[index] = getvalue(2*index, low, mid) + getvalue(2*index+1 ,
>> mid+1,high);
>>     return 0;
>>
>>
>> }
>>
>>
>>
>> long long query( long long index, long long down, long long up, long long
>> low, long long high)
>> {
>>
>>     //printf("%lld %lld  %lld  %lld",low,high,up,down);
>>
>>     long long mid;
>>     mid = (low+high)/2;
>>
>>
>>
>>
>>     if(  down <= low && high<=up)
>>     return a[index]  + v[index]*( high-low+1);
>>
>>     if(  low > up || high < down)
>>     return 0;
>>
>>
>>     v[2*index] += v[index];
>>     v[2*index+1] += v[index];
>>
>>
>>
>>
>>     a[index] = getvalue(2*index, low, mid) + getvalue(2*index+1 ,
>> mid+1,high);
>>
>>
>>
>>     v[index] =0;
>>
>>     return query( 2*index,down,up, low, mid)+query(2*index+1, down,up,
>> mid+1, high);
>>
>>
>>
>>
>> }
>>
>>
>>
>>
>> int main()
>> {
>>     long long t,n,p,quer,vr,val,i,q;
>>
>>
>>         scanf("%lld",&t);
>>
>>         while(t--)
>>         {
>>               scanf("%lld%lld",&n,&quer);
>>
>>               for(i=0;i<=4*n;i++)
>>                 a[i] =0,v[i] =0;
>>
>>
>>               while(quer--)
>>               {
>>                        // for(i=1;i<8;i++)
>>                         //printf("%lld   ",a[i]);
>>                         //printf("\n");
>>
>>                         scanf("%lld%lld%lld",&vr,&p,&q);
>>                         if(!vr)
>>                         {scanf("%lld",&val);
>>                         update(  1,p,q,1,n,val);
>>                         }
>>                         else
>>                         printf("%lld\n",query( 1, p, q, 1, n));
>>               }
>>
>>               //printf("bye");
>>    }
>>
>>     return 0;
>> }
>>
>>
>>
>> On Tue, Feb 26, 2013 at 12:24 PM, emmy <[email protected]> wrote:
>>
>>> Problem statement <http://www.spoj.com/problems/HORRIBLE/>
>>>
>>> Here <http://ideone.com/NhDuYo> is my code. I am using segment trees +
>>> Lazy propagation. Please help me figure out my mistake.
>>> I am getting a WA
>>>
>>> Note:
>>> invariant : l <= p <=q <= r
>>>
>>> l and r are the limits of that node
>>> p and q is the query range.
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Algorithm Geeks" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>>
>>>
>>
>>
>>
>> --
>> *Dheeraj Hasija*
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Algorithm Geeks" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Algorithm Geeks" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>



-- 
__________________________________________________

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to