Pagini recente » Cod sursa (job #1170107) | Cod sursa (job #2166301) | Cod sursa (job #1249771) | Cod sursa (job #477857) | Cod sursa (job #240405)
Cod sursa(job #240405)
#include<stdio.h>
int n,m;
unsigned int nr[100010];
int bit(int x){
return (x&(x-1))^x;
}
void add(int poz,int val){
nr[poz]+=val;
while((poz+=bit(poz))<=n)
nr[poz]+=val;
}
unsigned int sum(int poz){
unsigned int s=0;
while(poz){
s+=nr[poz];
poz-=bit(poz);
}
return s;
}
int caut(unsigned int x){
int i,p=0;
unsigned int s;
for(i=1<<20;i;i>>=1){
if(i+p>n)
continue;
p+=i;
s=sum(p);
if(s==x)
return p;
if(s<x)
continue;
p-=i;
}
return -1;
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int i,x;
unsigned int a,b;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i){
scanf("%d",&x);
add(i,x);
}
for(i=0;i<m;++i){
scanf("%d",&x);
if(x==0){
scanf("%d%d",&a,&b);
add(a,b);
}
if(x==1){
scanf("%d%d",&a,&b);
printf("%d\n",(unsigned int)sum(b)-(unsigned int)sum(a-1));
}
if(x==2){
scanf("%d",&a);
printf("%d\n",caut(a));
}
}
fclose(stdin);
fclose(stdout);
return 0;
}