Pagini recente » Cod sursa (job #3250185) | Cod sursa (job #1755675) | Cod sursa (job #1401283) | Cod sursa (job #361099) | Cod sursa (job #216543)
Cod sursa(job #216543)
#include <stdio.h>
long v[101000], n, i, j, k, m, p, r, a, b, ras;
void update(int x, int y)
{
while(x<=n)
{
v[x]+=y;
x=x+(x&-x);
}
}
int querry(int x)
{
int s;
s=0;
while(x>0)
{
s=s+v[x];
x=x&(x-1);
}
return s;
}
int cauta(int x)
{
int y, s, p;
y=1;
s=0;
p=0;
while((y<<1)<=n)
{
y=y<<1;
}
while(y>0)
{
if(s+v[p+y]<=x)
{
p=p+y;
s=s+v[p];
if (s==a) return p;
}
y=y/2;
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d", &n, &m);
p=1;
while(p<n)
{
p=p<<1;
}
for(i=1; i<=n; i++)
{
scanf("%d", &a);
update(i, a);
}
for(i=1; i<=m; i++)
{
scanf("%d", &r);
if(r==0)
{
scanf("%d %d", &a, &b);
update(a, b);
}
if(r==1)
{
scanf("%d %d", &a, &b);
printf("%d\n", querry(b)-querry(a-1));
}
if(r==2)
{
scanf("%d", &a);
printf("%d\n", cauta(a));
}
}
return 0;
}