Pagini recente » Cod sursa (job #293369) | Cod sursa (job #730445) | Cod sursa (job #1792144) | Cod sursa (job #1193460) | Cod sursa (job #1264896)
#include <cstdio>
int n;
int aib[100001];
int query(int poz)
{
int s=0;
for( ; poz; poz-=poz&(poz-1)^poz)
s=s+aib[poz];
return s;
}
void update(int poz, int val)
{
for( ; poz<=n; poz+=poz&(poz-1)^poz)
aib[poz]=aib[poz]+val;
}
using namespace std;
int main()
{ freopen("aib.in", "r",stdin);
freopen("aib.out", "w",stdout);
int m,i,x,op,a,b,j,h;
scanf("%d%d", &n, &m);
for(i=1; i<=n; i++){
scanf("%d", &x);
update(i,x);
}
for(i=0; i<m; i++){
scanf("%d", &op);
if(op==0){
scanf("%d%d", &a, &b);
update(a,b);
}
if(op==1){
scanf("%d%d", &a, &b);
printf("%d\n", query(b)-query(a-1));
}
if(op==2){
scanf("%d", &a);
for(h=1; h<n; h<<=1);
for(j=0; h; h=h/2){
if(h+j<=n){
if(a>=aib[h+j]){
j=j+h;
a=a-aib[j];
if(a==0)
printf("%d\n", j);
}
}
}
if(a!=0)
printf("-1\n");
}
}
fclose(stdin);
fclose(stdout);
return 0;
}