Pagini recente » Cod sursa (job #2255442) | Cod sursa (job #3223528) | Cod sursa (job #2662340) | Cod sursa (job #563583) | Cod sursa (job #1760974)
#include <stdio.h>
int bit[100009],n,m,i,x,y,z,p;
int next_int(FILE * in)
{
char x,y;
int z=0;;
x=1;
while (x<48 || x> 57)
y=fread(&x,1,1,in);
while (x>=48 && x<=57)
z=(z<<1)+(z<<3)+x-48,y=fread(&x,1,1,in);
return z;
}
void update(int poz,int val)
{
for ( ; poz<=n; poz+= poz & (-poz))
bit[poz]+=val;
}
int getsum(int poz)
{
int sum;
for (sum=0 ; poz ; poz-= poz & (-poz))
sum+=bit[poz];
return sum;
}
int getpoz(int x)
{
int i=n,pp=p;
for ( ; pp ; pp>>=1)
if (i-pp > 0 && getsum(i-pp)>=x)
i-=pp;
if (getsum(i)==x) return i;
return -1;
}
int main(int argc, char const *argv[])
{
FILE * in =fopen("aib.in","r");
FILE * out=fopen("aib.out","w");
n=next_int(in);
m=next_int(in);
for (p=1;p<=n;p<<=1);
for (i=0;i<n;++i)
{
x=next_int(in);
update(i+1,x);
}
while (m--)
{
x=next_int(in);
y=next_int(in);
if (x!=2)
z=next_int(in);
if (x==0)
update(y,z); else
if (x==1)
fprintf(out,"%d\n",getsum(z)-getsum(y-1)); else
fprintf(out,"%d\n",getpoz(y));
}
fclose(in);
fclose(out);
return 0;
}