Pagini recente » Cod sursa (job #3272391) | Cod sursa (job #1264444) | Cod sursa (job #1130680) | Cod sursa (job #491692) | Cod sursa (job #1694497)
#include <iostream>
#include <fstream>
#define NMAX 100001
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
long long n, m, a[NMAX], BIT[NMAX];
void update(int x, int val){
for(;x<=n; x+=x&(-x))BIT[x]+=val;
}
int query(int x){
int s=0;
for(; x>0; x-=x&(-x))s+=BIT[x];
return s;
}
int searchForValue(int sum){
int pos=n+1, B;
int limst=0, limdr=n+1;
int S=0;
B=n;
S=query(B);
if(S==sum)pos=n;
while(B){
B=(limst+limdr)>>1;
S=query(B);
if(S>sum){
if(limdr>B)limdr=B;
B-=1;
}else if(S==sum){
pos=min(pos,B);
limdr=B;
B-=1;
}else{
if(limst<B)limst=B;
B+=1;
}
if(B<=limst)break;
if(B>=limdr)break;
}
if(pos==n+1)return -1;
return pos;
}
void init(){
for(int i=1; i<=n; i++)update(i, a[i]);
}
void read(){
in>>n>>m;
int op, X, B;
long A;
for(int i=1; i<=n; i++)in>>a[i];
init();
a[0]=0;
for(int i=1; i<=m; i++){
in>>op;
if(op==0){
in>>X>>B;
a[X]+=B;
update(X, B);
}else if(op==1){
in>>X>>B;
out<<query(B)-query(X-1)<<"\n";
}else{
in>>A;
out<<searchForValue(A)<<"\n";
}
}
}
int main(){
read();
return 0;
}