Pagini recente » Cod sursa (job #3162107) | Cod sursa (job #2692928) | Cod sursa (job #552791) | Cod sursa (job #1090585) | Cod sursa (job #766270)
Cod sursa(job #766270)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
int main(){
ifstream cinr ("aib.in");
ofstream cour ("aib.out");
int n, n1, k,s,l,r,q,m;
cinr >> n1;
cinr >> m;
n=1<<int(log(n1-1)/log(2)+1);
vector<int> v(n*2,0);
for(int i=0; i<n1; i++){
cinr >> v[i+n];
}
for(int i=n-1; i>0; i--){
v[i]=v[2*i]+v[2*i+1];
}
for(int i=1; i<=m; i++){
cinr >> q;
if(q==2){
cinr >> k;
s=1;
while(s<n){
if(v[2*s]==k){ s*=2; break; }
if(v[2*s+1]==k){ s=2*s+1; break; }
if(v[2*s]<k){
k-=v[2*s];
s=2*s+1;
}
else { s*=2; }
}
while(s<n){ s=2*s+1; }
if(v[s]!=k){ cour << "-1\n"; }
else { cour << s-n+1 << "\n"; }
}
if(q==1){
cinr >> l; cinr >> r;
l+=n-1; r+=n-1; s=0;
while(l<=r){
if(l%2==1) s+=v[l];
if(r%2==0) s+=v[r];
l=(l+1)/2; r=(r-1)/2;
}
cour << s << "\n";
}
if(q==0){
cinr >> l; cinr >> r;
l+=n-1;
while(l>0){
v[l]+=r;
l/=2;
}
}
}
cour.close();
cinr.close();
return 0;
}