Pagini recente » Cod sursa (job #877296) | Cod sursa (job #2888501) | Cod sursa (job #2906104) | Cod sursa (job #437086) | Cod sursa (job #775808)
Cod sursa(job #775808)
/* 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;
}