Pagini recente » Cod sursa (job #1833161) | Cod sursa (job #2507274) | Cod sursa (job #1302703) | Cod sursa (job #294382) | Cod sursa (job #370159)
Cod sursa(job #370159)
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 q=0;
while(poz<=n){
tree[poz] += valoare;
while(!(poz & (1<<q))) q++;
poz += (1<<q);
}
}
int Sum(int poz){
int s=0,q=0;
while(poz){
s+=tree[poz];
while(!(poz & (1<<q))) q++;
poz -= 1<<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;
}