Pagini recente » Cod sursa (job #435886) | Cod sursa (job #2881957) | Cod sursa (job #1117694) | Cod sursa (job #1126228) | Cod sursa (job #1654697)
#include <fstream>
using namespace std;
long long last2(long long);
void upd(long long,long long);
long long query(long long);
long long cautbin(long long,long long,long long);
long long n,m,aib[100005];
int main(){
freopen("aib.in","r",stdin);
scanf("%lld%lld",&n,&m);
for (long long i=1;i<=n;i++){
long long x;
scanf("%lld",&x);
upd(i,x);
}
for (long long i=1;i<=m;i++){
long long x;
scanf("%lld",&x);
if (x<2){
long long a,b;
scanf("%lld%lld",&a,&b);
if (x==0){
upd(a,b);
}
else {
long long s1=query(a-1);
long long s2=query(b);
printf("%lld\n",s2-s1);
}
}
else {
long long a;
scanf("%lld",&a);
printf("%lld\n",cautbin(1,n,a));
}
}
}
void upd(long long pos,long long val){
for (long long i=pos;i<=n;i+=last2(i)){
aib[i]+=val;
}
}
long long query(long long x){
long long ans=0;
for (long long i=x;i>0;i-=last2(i)){
ans+=aib[i];
}
return ans;
}
long long last2(long long x){
return (x&(-x));
}
long long cautbin(long long st,long long dr,long long x){
if (st>dr){
return -1;
}
long long mij=(st+dr)/2;
long long suma=query(mij);
if (suma==x){
return mij;
}
else {
if (suma<x){
return cautbin(mij+1,dr,x);
}
else {
if (suma>x){
return cautbin(st,mij-1,x);
}
}
}
}