Pagini recente » Cod sursa (job #104822) | Cod sursa (job #1217777) | Cod sursa (job #783110) | Cod sursa (job #2985343) | Cod sursa (job #2639188)
#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 pos=n+1,dr=n+1,st=0,mid,s;
mid=n;
s=sum(mid);
if(s==b) return n;
while(mid){
mid=(dr+st)>>1;
s=sum(mid);
if(s>b){
dr=mid-1;
}else if(s == b){
return mid;
}else{
st=mid+1;
}
}
if(pos == mid)return -1;
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;
}