Pagini recente » Cod sursa (job #628494) | Cod sursa (job #1602651) | Cod sursa (job #1055384) | Cod sursa (job #875348) | Cod sursa (job #2639189)
#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){
if(dr >mid)dr=mid;
mid--;
}else if(s == b)pos=min(pos,mid),dr=mid,mid--;
else{
if(st<mid)st=mid;
mid++;
}
if(mid>=dr)break;
if(mid<=st)break;
}
if(pos == n+1)return -1;
return pos;
}
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;
}