Pagini recente » Cod sursa (job #2833172) | Cod sursa (job #505431) | Cod sursa (job #1114801) | Cod sursa (job #3173295) | Cod sursa (job #1370893)
#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;
}