Pagini recente » Cod sursa (job #497878) | Cod sursa (job #2917214) | Cod sursa (job #1813644) | Cod sursa (job #59922) | Cod sursa (job #2769236)
//Ilie Dumitru
#include<cstdio>
const int NMAX=100005;
int N, Arb[NMAX];
void updt(int pos, int val)
{
int bit;
while(pos<=N)
{
Arb[pos]+=val;
bit=pos^(pos&(pos-1));
pos+=bit;
}
}
int query(int x)
{
int S=0;
while(x)
{
S+=Arb[x];
x&=x-1;
}
return S;
}
int src(int x)
{
int i, bit;
bit=1<<(31-__builtin_clz(N));
for(i=0;bit;bit>>=1)
{
if(i+bit<=N && Arb[i+bit]<=x)
{
i+=bit;
x-=Arb[i];
if(!x)
return i;
}
}
return -1;
}
int main()
{
int i, val, op, a, b, q;
FILE *f=fopen("aib.in", "r"), *g=fopen("aib.out", "w");
fscanf(f, "%d%d", &N, &q);
for(i=1;i<=N;++i)
{
fscanf(f, "%d", &val);
updt(i, val);
}
while(q--)
{
fscanf(f, "%d%d", &op, &a);
if(op==2)
fprintf(g, "%d\n", src(a));
else
{
fscanf(f, "%d", &b);
if(op)
fprintf(g, "%d\n", query(b)-query(a-1));
else
updt(a, b);
}
}
fclose(f);
fclose(g);
return 0;
}