Cod sursa(job #1370893)

Utilizator jordasIordache Andrei Alexandru jordas Data 3 martie 2015 17:54:49
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#define nMax 100001

using namespace std;

 ifstream x ("aib.in");
 ofstream y ("aib.out");

 int n,m;
 int v[nMax],aib[nMax];

 int LSB(int n)
 {
     int k=1;

     while(n%2==0)
     {
         k<<=1;

         n>>=1;
     }

     return k;
 }

 void generate_aib()
 {
     int i,j;

     int l;

     for(i=1;i<=n;i++)
     {
         l=i-LSB(i)+1;

         for(j=l;j<=i;j++)
            aib[i]+=v[j];
     }
/*
     for(i=1;i<=n;i++)
        y<<aib[i]<<' ';
     y<<'\n';
*/
 }

 int sum(int n)
 {
     int s=0;

     while(n)
     {
         s+=aib[n];
         n-=LSB(n);
     }

     return s;
 }

 void add(int a, int b)
 {
     v[a]+=b;

     while(a<=n)
     {
         aib[a]+=b;

         a+=LSB(a);
     }
/*
     for(int i=1;i<=n;i++)
        y<<aib[i]<<' ';
     y<<'\n';
*/
 }

 int pozitie(int a)
 {
     int k=1;

     while(a<aib[k])
        k<<=1;

     if(a==aib[k])
        return k;

     k>>=1;

     a-=aib[k];

     while(a && k<=n)
     {
         k++;
         a-=v[k];
     }

     if(k<=n)
        return k;
     else
        return -1;
 }

int main()
{
    int i;


    x>>n>>m;

    for(i=1;i<=n;i++)
       x>>v[i];
/*
    for(i=1;i<=n;i++)
       y<<v[i]<<' ';
    y<<'\n';
*/
    generate_aib();

    int t,a,b;

    for(i=1;i<=m;i++)
    {
        x>>t;

        switch(t)
        {
            case 0:
               x>>a;
               x>>b;
               add(a,b);
               break;
            case 1:
               x>>a;
               x>>b;
               y<<sum(b)-sum(a-1)<<'\n';
               break;
            case 2:
               x>>a;
               y<<pozitie(a)<<'\n';
               break;
        }
    }

    return 0;
}