Pagini recente » Cod sursa (job #2921873) | Cod sursa (job #570117) | Cod sursa (job #3032152) | Cod sursa (job #1407721) | Cod sursa (job #1237509)
#include <cstdio>
using namespace std;
int V[100010],n,m,x,i,a,b,suma(int),L,R,M;
void upd(int,int);
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
upd(i,x);
}
for(;m;m--)
{
scanf("%d",&x);
if(x==0)
{
scanf("%d%d",&a,&b);
upd(a,b);
continue;
}
if(x==1)
{
scanf("%d%d",&a,&b);
printf("%d\n",suma(b)-suma(a-1));
continue;
}
scanf("%d",&a);
if(suma(n)<a)
{
printf("-1\n");
continue;
}
for(L=0,R=n;R-L>1;)
{
M=(L+R)/2;
if(suma(M)<a)L=M;
else R=M;
}
if(suma(R)==a)printf("%d\n",R);
else printf("-1\n");
}
return 0;
}
int suma(int poz)
{
int ret = 0;
for(;poz;poz-=poz&(-poz))
ret+=V[poz];
return ret;
}
void upd(int poz, int val)
{
for(;poz<=n;poz+=poz&(-poz))
V[poz]+=val;
}