Pagini recente » Cod sursa (job #2246216) | Cod sursa (job #1494181) | Cod sursa (job #3187960) | Cod sursa (job #327131) | Cod sursa (job #751793)
Cod sursa(job #751793)
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
using namespace std;
int main(){
ifstream cinr ("aib.in");
ofstream cour ("aib.out");
int n,m,n1,id,r,a,b;
cinr >> n1; cinr >> m;
n=1<<int(log(n1-1)/log(2)+1);
vector<int> v(2*n,0);
for(int i=n; i<n+n1; i++) cinr >> v[i];
for(int i=n-1; i>0; i--) v[i]=v[2*i]+v[2*i+1];
for(int j=1; j<=m; j++){
cinr >> id;
if(id==0){
cinr >> a; a+=n-1;
cinr >> b;
while(a>0){
v[a]+=b;
a/=2;
}
}
if(id==1){
r=0;
cinr >> a; a+=n-1;
cinr >> b; b+=n-1;
while(b>=a){
if(a%2==1){ r+=v[a]; }
if(b%2==0){ r+=v[b]; }
a=(a+1)/2;
b=(b-1)/2;
}
cour << r << "\n";
}
if(id==2){
cinr >> b; a=1; r=0;
while(a<2*n){
if(v[a]+r==b){ r+=v[a]; break; }
if(v[a]+r>b) { a*=2; }
else { r+=v[a]; a++; }
}
while(a<n) a=2*a+1;
if(r==b) { cour << a-n+1 << "\n"; }
else { cour << -1 << "\n"; }
}
}
//for(int i=0; i<2*n; i++) cout << v[i] << " ";
cinr.close(); cour.close();
//cin.ignore(1);
return 0;
}