Pagini recente » Cod sursa (job #2060997) | Cod sursa (job #2420621) | Cod sursa (job #2863517) | Cod sursa (job #902709) | Cod sursa (job #3246221)
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n;
long long aib[200005];
int fsb(long long x)
{
return x&-x;
}
long long query(long long pos)
{
long long s=0;
while (pos)
{
s+=aib[pos];
pos-=fsb(pos);
}
return s;
}
void upd(long long pos, long long x)
{
while (pos<=n)
{
aib[pos]+=x;
pos+=fsb(pos);
}
}
long long cautbin(long long a)
{
long long pos=0, pas=(1<<20), minte=0;
while (pas)
{
if (pos + pas <= n && minte+aib[pos+pas]<a)
{
minte+=aib[pos+pas];
pos+=pas;
}
pas/=2;
}
if (query(pos+1)==a)
return pos+1;
return -1;
}
int main()
{
cin>>n;
int m;
cin>>m;
int a, b, c;
for (int i=1; i<=n; i++)
{
cin>>a;
upd(i, a);
}
for (int i=1; i<=m; i++)
{
cin>>a;
if (a==0)
{
cin>>b>>c;
upd(b,c);
}
if (a==1)
{
cin>>b>>c;
cout<<query(c)-query(b-1)<<'\n';
}
if (a==2)
{
cin>>b;
cout<<cautbin(b)<<'\n';
}
}
return 0;
}