Pagini recente » Cod sursa (job #1043659) | Cod sursa (job #796186) | Cod sursa (job #513227) | Cod sursa (job #2698273) | Cod sursa (job #545420)
Cod sursa(job #545420)
#include <cstdio>
#define MaxN 100005
#define infile "aib.in"
#define outfile "aib.out"
int N,M,c[MaxN],i,s,s1,s2,op,a,b,k;
int bit(int x)
{
return (x & (x-1)) ^ x;
}
void Update(int poz,int val)
{
while(poz<=N)
{
c[poz]+=val;
poz+=bit(poz);
}
}
void Query(int poz)
{
while(poz>0)
{
s+=c[poz];
poz-=bit(poz);
}
}
int Search(int a)
{
int i,step;
for(step=1; step<N; step<<=1);
for(i=0; step; step>>=1)
if(step+i<=N)
if(a>=c[i+step])
{
i+=step; a-=c[i];
if(!a) return i;
}
return -1;
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++)
{
scanf("%d",&s);
Update(i,s);
}
for(i=1;i<=M;i++)
{
scanf("%d",&op);
if(!op)
{
scanf("%d%d",&a,&b);
Update(a,b);
}
else
if(op==1)
{
scanf("%d%d",&a,&b);
s=0;
Query(a-1); s1=s;
s=0;
Query(b); s2=s;
printf("%d\n",s2-s1);
}
else
{
scanf("%d",&a);
printf("%d\n",Search(a));
}
}
fclose(stdin);
fclose(stdout);
return 0;
}