Pagini recente » Cod sursa (job #200217) | Cod sursa (job #637068) | Cod sursa (job #1057714) | Cod sursa (job #2287396) | Cod sursa (job #1766748)
#include <iostream>
#include <cstdio>
using namespace std;
unsigned int aib[100000+5];
unsigned int n;
unsigned query(unsigned int p){
unsigned int rez=0,pow2;
while(p!=0){
rez+=aib[p];
pow2=(p&(-p));
p-=pow2;
}
return rez;
}
unsigned int searchh(unsigned int val){
unsigned int i=0,pas=1<<16;
while(pas!=0){
if(i+pas<=n && aib[i+pas]<=val){
i+=pas;
val-=aib[i];
}
pas/=2;
}
if(val==0)return i;
return -1;
}
void update(unsigned int p,unsigned int val){
unsigned int pow2;
while(p<=n){
aib[p]+=val;
pow2=(p&(-p));
p+=pow2;
}
}
int main()
{
unsigned int k,b,a,r;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%u %u",&n,&k);
for(unsigned int i=1;i<=n;i++)
scanf("%u",&b),update(i,b);
for(unsigned int i=1;i<=k;i++){
scanf("%u",&r);
if(r==0 || r==1)
scanf("%u %u",&a,&b);
else
scanf("%u",&a);
// prunsigned intf("%u %u\n",a,b);
if(r==0){
update(a,b);
continue ;
}
if(r==1){
printf("%u\n",query(b)-query(a-1));
continue ;
}
printf("%u\n",searchh(a));
}
return 0;
}