Pagini recente » Cod sursa (job #2970489) | Cod sursa (job #1808050) | Cod sursa (job #2975177) | Cod sursa (job #1978606) | Cod sursa (job #2889544)
//Ilie Dmitru
#include<fstream>
#include<cstdio>
typedef long long int ll;
const int NMAX=100005;
const ll MOD=194767;
FILE* f=fopen("aib.in", "r"), *g=fopen("aib.out", "w");
int N, AIB[NMAX], v[NMAX];
void createAIB()
{
int i;
for(i=1;i<=N;++i)
{
AIB[i]+=v[i];
if(i+(i&-i)<=N)
AIB[i+(i&-i)]+=AIB[i];
}
}
void op1(int index, int add)
{
while(index<=N)
{
AIB[index]+=add;
index+=index&-index;
}
}
int query(int index)
{
int s=0;
while(index)
{
s+=AIB[index];
index^=index&-index;
}
return s;
}
int op2(int a, int b) {return query(b)-query(a-1);}
int op3(int sum)
{
int index=0, bit=N;
while(bit&(bit-1))
bit^=bit&-bit;
for(;bit;bit>>=1)
{
if(index+bit<=N && sum-AIB[index+bit]>-1)
{
index+=bit;
sum-=AIB[index];
}
}
if(sum)
return -1;
return index;
}
int main()
{
int M, i, op, a, b;
fscanf(f, "%d%d", &N, &M);
for(i=1;i<=N;++i)
fscanf(f, "%d", v+i);
createAIB();
for(i=0;i<M;++i)
{
fscanf(f, "%d%d", &op, &a);
switch(op)
{
case 0:
fscanf(f, "%d", &b);
op1(a, b);
break;
case 1:
fscanf(f, "%d", &b);
fprintf(g, "%d\n", op2(a, b));
break;
case 2:
fprintf(g, "%d\n", op3(a));
break;
}
}
fclose(f);
fclose(g);
return 0;
}