Pagini recente » Cod sursa (job #1075389) | Cod sursa (job #710405) | Cod sursa (job #612307) | Cod sursa (job #942000) | Cod sursa (job #258201)
Cod sursa(job #258201)
#include <stdio.h>
#include <string.h>
#define in "aib.in"
#define out "aib.out"
#define dim 100001
inline int minim(int a,int b){
if(a<b)return a;
return b;
}
FILE *f=fopen(in,"r"),*g=fopen(out,"w");
int n,m,t;
int arb[dim];
int c,s;
void actualizare(int,int);
int interogare(int);
int cautare(int);
int main(){
memset(arb,0,sizeof(arb));
int k,x,y,i;
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&t);
actualizare(i,t);
}
for(;m;m--){
fscanf(f,"%d",&k);
if(k<2){
fscanf(f,"%d%d",&x,&y);
if(!k)actualizare(x,y);
else fprintf(g,"%d\n",interogare(y)-interogare(x-1));
}
else{
fscanf(f,"%d",&x);
fprintf(g,"%d\n",cautare(x));
}
}
}
void actualizare(int poz,int val){
c=0;
while (poz<=n){
arb[poz]+=val;
while(!(poz&(1<<c)))c++;
poz+=(1<<c);
c++;
}
}
int interogare(int poz){
c=0,s=0;
while(poz>0){
s+=arb[poz];
while(!(poz&(1<<c)))c++;
poz-=(1<<c);
c++;
}
return s;
}
int cautare(int val){
int i,step;
for(step=1;step<n;step<<=1);
for(i=0;step;step>>=1){
if(i+step<=n){
if(val>=arb[i+step])
{
i+=step,val-=arb[i];
if(!val)return i;
}
}
}
return -1;
}