Pagini recente » Cod sursa (job #1815184) | Cod sursa (job #2362457) | Cod sursa (job #1044733) | Cod sursa (job #1565621) | Cod sursa (job #370149)
Cod sursa(job #370149)
using namespace std;
#include <cstdio>
int tree[100010],n;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
void Add(int poz, int valoare){
int tmp,q;
while(poz<=n){
tree[poz] += valoare;
tmp=poz;q=1;
while(!(tmp&1)) q<<=1, tmp >>=1;
poz+=q;
}
/*
for(int i=1;i<=n;i++)
printf("%d ",tree[i]);
printf("\n");
*/
}
int Sum(int poz){
int s=0,tmp,q;
while(poz){
s+=tree[poz];
tmp=poz;q=1;
while(!(tmp&1)) q<<=1, tmp >>=1;
poz -= q;
}
return s;
}
int Ppoz(int suma){
int st=1,dr=n;
if(suma<tree[1] || suma>Sum(n))
return -1;
while(st<=dr){
int mijloc = (st+dr)>>1;
int summ = Sum(mijloc);
if(summ == suma)
return mijloc;
else
if(summ<suma)
st=mijloc+1;
else
dr=mijloc-1;
}
return -1;
}
int main(){
int m,a,b,op;
fscanf(f,"%d%d",&n,&m);
for(int i=1;i<=n;i++){
fscanf(f,"%d",&a);
Add(i,a);
}
for( ; m ; --m){
fscanf(f,"%d",&op);
if(op == 2){
fscanf(f,"%d",&a);
fprintf(g,"%d\n",Ppoz(a));
}
else{
fscanf(f,"%d%d", &a,&b);
if(op==0)
Add(a,b);
else
fprintf(g,"%d\n",Sum(b)-Sum(a-1));
}
}
return 0;
}