Pagini recente » Cod sursa (job #499847) | Cod sursa (job #2969197) | Cod sursa (job #1889932) | Cod sursa (job #2143440) | Cod sursa (job #2282679)
#include <cstdio>
using namespace std;
const int N=100000+5;
int n,t;
int aib[N];
inline void add(int p,int x)
{
for(int i=p;i<=n;i+=i&(-i))
{
aib[i]+=x;
}
}
inline int prefix(int p)
{
int ans=0;
for(int i=p;i>=1;i-=i&(-i))
{
ans+=aib[i];
}
return ans;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&t);
for(register int i=1;i<=n;i++)
{
register int x;
scanf("%d",&x);
add(i,x);
}
while(t--)
{
register int hulk;
scanf("%d",&hulk);
if(hulk==0)
{
register int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
if(hulk==1)
{
register int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",prefix(b)-prefix(a-1));
}
if(hulk==2)
{
register int x,now=0;
scanf("%d",&x);
register int r=0,pas=(1<<16);
while(pas)
{
if(r+pas<=n && now+aib[r+pas]<x)
{
r+=pas;
now+=aib[r];
}
pas>>=1;
}
r++;
if(1<=r && r<=n && prefix(r)==x)
{
printf("%d\n",r);
}
else
{
printf("-1\n");
}
}
}
return 0;
}