Pagini recente » Cod sursa (job #1801779) | Cod sursa (job #1897149) | Cod sursa (job #3128477) | Cod sursa (job #2848561) | Cod sursa (job #2718759)
//Ilie Dumitru
#include<cstdio>
int N, tree[100005];
void updt(int pos, int val)
{
while(pos<=N)
{
tree[pos]+=val;
pos+=(-pos)&pos;
}
}
int sum(int pos)
{
int s=0;
while(pos)
{
s+=tree[pos];
pos-=(-pos)&pos;
}
return s;
}
int binsrc(int s)
{
int pos, bit, best=-1;
for(bit=1;bit<=N;bit<<=1);
bit>>=1;
for(pos=0;bit;bit>>=1)
{
pos+=bit;
if(s==tree[pos])
{
best=pos;
s=0;
pos-=bit;
}
else
{
if(s<tree[pos])
pos-=bit;
else
s-=tree[pos];
}
}
return best;
}
int main()
{
int M, k, i, a, b;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%i%i", &N, &M);
for(i=1;i<=N;++i)
{
scanf("%i", &a);
updt(i, a);
}
while(M--)
{
scanf("%i", &k);
if(k==2)
{
scanf("%i", &a);
printf("%i\n", binsrc(a));
}
else
{
scanf("%i%i", &a, &b);
if(k)
printf("%i\n", sum(b)-sum(a-1));
else
updt(a, b);
}
}
}