Pagini recente » Cod sursa (job #1801392) | Cod sursa (job #1233989) | Cod sursa (job #2771841) | Cod sursa (job #1128155) | Cod sursa (job #1424988)
#include <cstdio>
using namespace std;
int aib[100005],n;
void update(int poz,int val)
{
for( ; poz<=n; poz+=poz&-poz)
aib[poz]+=val;
}
int query(int poz)
{
int s=0;
for( ; poz; poz-=poz&-poz)
s=s+aib[poz];
return s;
}
int bs(int val)
{
int st=1,dr=n,med,last=-1;
while(st<=dr){
med=(st+dr)/2;
if(query(med)==val){
last=med;
dr=med-1;
}
else{
if(query(med)<val)
st=med+1;
else
dr=med-1;
}
}
return last;
}
int main()
{ freopen("aib.in", "r",stdin);
freopen("aib.out", "w",stdout);
int m,i,op,a,b,val;
scanf("%d%d", &n, &m);
for(i=1;i<=n; i++){
scanf("%d", &val);
update(i, val);
}
for(i=1; i<=m; i++){
scanf("%d", &op);
if(op==0){
scanf("%d%d", &a, &b);
update(a, b);
}
else{
if(op==1){
scanf("%d%d", &a, &b);
printf("%d\n", query(b)-query(a-1));
}
else{
scanf("%d", &a);
printf("%d\n", bs(a));
}
}
}
return 0;
}