Pagini recente » Borderou de evaluare (job #1842129) | Borderou de evaluare (job #2639526) | Cod sursa (job #2639166)
#include <iostream>
#include <fstream>
using namespace std;
typedef long long ll;
ifstream in("aib.in");
ofstream out("aib.out");
const int Nmax=100099;
ll n,m,s[Nmax],k,a,b;
ll sum(int x){
ll result=0;
int i=x;
while(i>=0){
result+=s[i];
i=(i & (i+1))-1;
}
return result;
}
void add(int pos,ll diff){
while(pos <=n){
s[pos]+=diff;
pos = pos | (pos+1);
}
}
ll cautare(ll b){
int dr=n+1,st=0,mid=(dr+st)/2,o;
while(st<dr){
o=sum(mid);
if(b>o){
st=mid;
}else if(b<o){
dr=mid;
}else return mid;
mid=(dr+st)/2;
}
return mid;
}
int main(){
in >>n>>m;
for(int i=1;i<=n;i++){
in >>k;
add(i,k);
}
while(m--){
in >>k;
if(k<2){
if(k){
in >>a>>b;
out <<sum(b)-sum(a-1)<<"\n";
}else{
in >>a>>b;
add(a,b);
}
}else{
in>>b;
out <<cautare(b)<<"\n";
}
}
return 0;
}