Pagini recente » Cod sursa (job #2763212) | Cod sursa (job #459915) | Cod sursa (job #902704) | Cod sursa (job #3293688) | Cod sursa (job #1654704)
#include <fstream>
using namespace std;
int last2(int);
void upd(int,int);
int query(int);
int cautbin(int,int,int);
int n,m,aib[100005];
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
int x;
scanf("%d",&x);
upd(i,x);
}
for (int i=1;i<=m;i++){
int x;
scanf("%d",&x);
if (x<2){
int a,b;
scanf("%d%d",&a,&b);
if (x==0){
upd(a,b);
}
else {
int s1=query(a-1);
int s2=query(b);
printf("%d\n",s2-s1);
}
}
else {
int a;
scanf("%d",&a);
printf("%d\n",cautbin(1,n,a));
}
}
}
void upd(int pos,int val){
for (int i=pos;i<=n;i+=last2(i)){
aib[i]+=val;
}
}
int query(int x){
int ans=0;
for (int i=x;i>0;i-=last2(i)){
ans+=aib[i];
}
return ans;
}
int last2(int x){
return (x&(-x));
}
int cautbin(int st,int dr,int x){
if (st>dr){
return -1;
}
int mij=(st+dr)/2;
int 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);
}
}
}
}