Pagini recente » Cod sursa (job #448916) | Cod sursa (job #3147296) | Cod sursa (job #1325947) | Cod sursa (job #68871) | Cod sursa (job #1264044)
#include<cstdio>
using namespace std;
const int nmax=1e5+1;
int aib[nmax];
int n, m;
void update(int pos, int val)
{for(; pos<=n; pos+=(pos&(pos-1))^pos)
aib[pos]+=val;
}
int querry(int pos)
{int s=0;
for(; pos; pos-=(pos&(pos-1))^pos)
s+=aib[pos];
return s;
}
int search(int a, int b, int val)
{int med, q, last=-1;
while(a<=b)
{med=(a+b)>>1;
q=querry(med);
if(q>=val)
{last=med;
b=med-1;
}
else a=med+1;
}
return last;
}
int main()
{freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &n, &m);
int i, op, a, b;
for(i=1; i<=n; i++)
{scanf("%d", &a);
update(i, a);
}
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);
printf("%d\n", querry(b)-querry(a-1));
}
else if(op==2)
{scanf("%d", &a);
b=search(1, n, a);
if(querry(b)!=a) b=-1;
printf("%d\n", b);
}
}
return 0;
}