Pagini recente » Cod sursa (job #1821710) | Cod sursa (job #1629628) | Cod sursa (job #1575932) | Cod sursa (job #2826882) | Cod sursa (job #1110972)
#include<cstdio>
using namespace std;
int aib[100001];
int n;
void aduna(int ind, int val)
{
int poz=1;
while(ind<=n)
{
aib[ind]+=val;
while(!(ind&poz))
poz<<=1;
ind+=poz;
}
}
int suma(int ind)
{
int sum=0;
int poz=1;
while(ind>0)
{
sum+=aib[ind];
while(!(ind&poz))
poz<<=1;
ind-=poz;
}
return sum;
}
int pozsum(int x)
{
int st=1,dr=n,mij,sum;
while(st<=dr)
{
mij=(st+dr)/2;
sum=suma(mij);
if(sum==x)
return mij;
if(sum>x)
dr=mij-1;
else
st=mij+1;
}
return -1;
}
int main()
{
int m;
int i;
int x;
int ind;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d ",&x);
aduna(i,x);
}
for(i=1;i<=m;i++)
{
scanf("%d ",&x);
if(x==0)
{
scanf("%d %d\n",&ind,&x);
aduna(ind,x);
}
else
{
if(x==1)
{
scanf("%d %d\n",&ind,&x);
printf("%d\n",suma(x)-suma(ind-1));
}
else
{
scanf("%d\n",&x);
printf("%d\n",pozsum(x));
}
}
}
fclose(stdin);
fclose(stdout);
return 0;
}