Pagini recente » Cod sursa (job #1235783) | Cod sursa (job #674960) | Cod sursa (job #2901060) | Cod sursa (job #1938007) | Cod sursa (job #2883237)
#include <bits/stdc++.h>
#define f(x) x&(-x)
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 100005;
int aib[NMAX];
int n,m,a,b,k,nr,operatie;
void update(int poz,int val){
for(int i=poz;i<=n;i+=f(i))
aib[i]+=val;
return;
}
int query(int poz){
int sum=0;
for(int i=poz;i>=1;i-=f(i))
sum+=aib[i];
return sum;
}
void find_pozmin(int a){
int st=1,dr=n,mij,rasp=0;
while(st<=dr){
mij=(st+dr)/2;
int suma = query(mij); // "suma primilor k termeni"
if(suma==a){
rasp=mij;
fout << rasp << '\n';
return;
}
if(suma<a){
st=mij+1;
} else {
dr=mij-1;
}
}
fout << "-1" << '\n';
return;
}
void citire(){
fin >> n >> m;
for(int i=1;i<=n;i++){
fin >> nr;
update(i,nr);
}
for(int i=1;i<=m;i++){
fin >> operatie;
if(operatie==0){
fin >> a >> b;
update(a,b);
}
if(operatie==1){
fin >> a >> b;
int sum=query(b)-query(a-1);
fout << sum << '\n';
}
if(operatie==2){
fin >> a;
find_pozmin(a);
}
}
}
int main()
{
citire();
return 0;
}