Pagini recente » Cod sursa (job #1572899) | Cod sursa (job #1186506) | Cod sursa (job #452947) | Cod sursa (job #746678) | Cod sursa (job #3154747)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
#define nmax 1000000
int msb(int x){
int msb=1;
while(x){
x=x>>1;
msb=msb<<1;
}
return msb;
}
int lsb(int x){
return x&(-x);
}
int v[nmax];
void build(int n){
for(int i=1;i<n;i++){
v[i+lsb(i)]+=v[i];
}
}
void update(int loc,int val,int n){
while(loc<n){
v[loc]+=val;
loc+=lsb(loc);
}
}
int query(int now,int stq,int drq){
int part1=0,part2=0;
int idx=stq-1;
while(idx>0){
part1+=v[idx];
idx-=lsb(idx);
}
idx=drq;
while(idx>0){
part2+=v[idx];
idx-=lsb(idx);
}
return part2-part1;
}
int search(int n,int sum){
int layer=msb(n)/2;
for(int i=0;layer>0;layer>>=1){
if(v[i+layer]<=sum && i+layer<=n){
i+=layer;
sum-=v[i];
if(sum==0){
return i;
}
}
}
return -1;
}
int main()
{
int orgN;
int n,m;
in>>n>>m;
for(int i=1;i<=n;i++){
in>>v[i];
}
orgN=n;
n=msb(n);
build(n);
int a,b,c;
for(int i=0;i<m;i++){
in>>c;
if(c==0){
in>>a>>b;
update(a,b,n);
}else if(c==1){
in>>a>>b;
out<<query(1,a,b)<<'\n';
}else{
in>>a;
out<<search(orgN,a)<<"\n";
}
}
}