Pagini recente » Cod sursa (job #490528) | Cod sursa (job #2343735) | Cod sursa (job #786804) | Cod sursa (job #2668248) | Cod sursa (job #1331973)
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
#define nmax 100010
int n,m,a[nmax],t,x,y;
void update(int poz,int val)
{
int c=0;
while (poz<=n)
{
while (!((1<<c)&poz))
c++;
a[poz]+=val;
poz+=1<<c;
c++;
}
}
int query(int poz)
{
int c=0,s=0;
while (poz>0)
{
while (!((1<<c)&poz))
c++;
s+=a[poz];
poz-=1<<c;
c++;
}
return s;
}
int suma(int val)
{
int put2=1,i;
for (;put2<n;put2<<=1);
for (i=0;put2;put2>>=1)
{
if (i+put2<=n)
if (val>=a[i+put2])
{
i+=put2;
val-=a[i];
if (!val) return i;
}
}
return -1;
}
int main()
{
int i,j;
cin>>n>>m;
for (i=1;i<=n;i++)
{
cin>>x;
update(i,x);
}
for (i=1;i<=m;i++)
{
cin>>t;
if (t==0)
{
cin>>x>>y;
update(x,y);
}
else if (t==1)
{
cin>>x>>y;
cout<<query(y)-query(x-1)<<'\n';
}
else
{
cin>>x;
cout<<suma(x)<<'\n';
}
}
}