Pagini recente » Cod sursa (job #505867) | Cod sursa (job #2455580) | Cod sursa (job #1813620) | Cod sursa (job #1475593) | Cod sursa (job #202403)
Cod sursa(job #202403)
#include <stdio.h>
#define N 100001
#define niv(x) (((x)^((x)-1))+1)/2
long mat[N];
long suma(long a)
{long S,j;
for(S=0,j=a;j>0;j-=niv(j))
{S+=mat[j];}
return S;
}
int main ()
{FILE *fin=fopen("aib.in","r");
FILE *fout=fopen("aib.out","w");
long m,n,a,b,i,j;
long st,dr,s;
fscanf(fin,"%ld%ld",&n,&m);
for (i=1;i<=n;i++)
{fscanf(fin,"%ld",&mat[i]);}
for (i=1;i<=n;i++)
{for(a=niv(i),b=i-1;a/2;a=a>>1,b=b-niv(b))
{mat[i]+=mat[b];}
}
for (i=1;i<=m;i++)
{fscanf(fin,"%ld",&a);
switch(a)
{case 0:
fscanf(fin,"%ld%ld",&a,&b);
for(j=a;j<=n;j+=niv(j))
{mat[j]+=b;}
break;
case 1:
fscanf(fin,"%ld%ld",&a,&b);
fprintf(fout,"%ld\n",suma(b)-suma(a-1));
break;
case 2:
fscanf(fin,"%ld",&a);
for(st=1,dr=n;suma((st+dr)/2)!=a||suma((st+dr)/2-1)==a;)
{((s=suma((st+dr)/2))<a)?(st=(st+dr)/2+1):(dr=(st+dr)/2-1);
}
fprintf(fout,"%ld\n",(st+dr)/2);
}
}
fclose(fout);
return 0;
}