Pagini recente » Cod sursa (job #880025) | Cod sursa (job #3287924) | Cod sursa (job #160680) | Cod sursa (job #1187472) | Cod sursa (job #3246218)
#include <fstream>
#define NMAX (int)(1e5)
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int aib[NMAX], n;
inline int lsb(int x)
{
return x&(-x);
}
void build()
{
for(int i=1;i<=n;i++)
if(i+lsb(i)<=n)
aib[i+lsb(i)]+=aib[i];
}
void update(int pos, int val)
{
for(int i=pos;i<=n;i+=lsb(i))
aib[i]+=val;
}
int query(int pos)
{
int s=0;
for(int i=pos;i>=1;i-=lsb(i))
s+=aib[i];
return s;
}
int caut_bin(int a)
{
int pas=(1<<(31-__builtin_clz(n))), r=pas, s=aib[pas];
while(pas>1)
{
pas/=2;
if(s<a && r+pas<=n)
{
r+=pas;
s+=aib[r];
}
else if(s>a && r-pas>=1)
{
s-=aib[r];
r-=pas;
s+=aib[r];
}
else if(s==a)
return r;
}
if(s==a)
return r;
return -1;
}
int main()
{
int m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>aib[i];
build();
while(m--)
{
int t, a, b;
cin>>t>>a;
if(t==2)
cout<<caut_bin(a)<<'\n';
else
{
cin>>b;
if(t)
cout<<query(b)-query(a-1)<<'\n';
else
update(a, b);
}
}
return 0;
}