Pagini recente » Cod sursa (job #600692) | Cod sursa (job #237342) | Cod sursa (job #1743999) | Cod sursa (job #1631987) | Cod sursa (job #3004935)
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int v[100001],n;
int tree[100001];
int ask(int poz){
int rez=0;
while(poz){
rez+=tree[poz];
poz-=poz&(-poz);
}
return rez;
}
void add(int poz,int val){
while(poz<=n){
tree[poz]+=val;
poz+=poz&(-poz);
}
}
int query(int L,int R){
if(L>R)
return 0;
else
return ask(R)-ask(L-1);
}
int Search(int val){
int i,k;
for(k=1;k<n;k<<=1);
for(i=0;k;k>>=1){
if(i+k<=n){
if(val>=tree[i+k]){
i+=k;
val-=tree[i];
if(!val)
return i;
}
}
}
return -1;
}
int main(){
int m;
f>>n>>m;
for(int i=1;i<=n;++i){
f>>v[i];
add(i,v[i]);
}
int cer,a,b;
while(m--){
f>>cer>>a;
if(cer==0){
f>>b;
v[a]+=b;
add(a,b);
}
if(cer==1){
f>>b;
g<<query(a,b)<<'\n';
}
if(cer==2)
g<<Search(a)<<'\n';
}
return 0;
}