Cod sursa(job #775808)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 9 august 2012 00:16:03
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
/* Arbori indexati binar */

#include<fstream>

using namespace std;

int n,m;
int i,j,k,c;
int arb[100001];

void update(int poz, int val)
{int C=0;
while(poz<=n)
  {arb[poz]+=val;
   while(!(poz & (1<<C)))   C++;
   poz+=(1<<C);
   C+=1;
   }
}

int sumr(int poz)
{int C=0, S=0;
 while(poz>0)
   {S+=arb[poz];
    while(!(poz & (1<<C))) C++;
     poz-=(1<<C);
     C+=1;
    }
 return S;   
}

int search(int val)
{int C=0;
 int suma=0;
 int start=0;
 if(val<arb[1])
   return -1;
 while(suma!=val && C>-1)
 {C=0; 
 while(true)
   {
    if(start+(1<<C)>n ||(suma+arb[start+(1<<C)])>val)
       break;
    C++;}
 C--;
 suma+=arb[start+(1<<C)];
 start+=(1<<C);}
 
 if(suma==val && start>0)
 return start;
 else
 return -1;
}

int main()
{int x,y,z;
ifstream f("aib.in");
ofstream g("aib.out");

f>>n>>m;
for(i=1; i<=n; i++)
  {f>>c;
   update(i,c);}
for(i=1; i<=m; i++)
  {f>>k;
   if(k==0)
    {f>>x>>y;
     update(x,y);}
   if(k==1)
    {f>>x>>y;
     z=sumr(y)-sumr(x-1);
     g<<z<<endl;
    }
   if(k==2)
    {f>>x;
    z=0;
    z=search(x);
    g<<z<<endl;}
}  
f.close();
g.close();
return 0;
}