Pagini recente » Cod sursa (job #1146951) | Cod sursa (job #1846718) | Cod sursa (job #1631752) | Cod sursa (job #743599) | Cod sursa (job #944101)
Cod sursa(job #944101)
#include <fstream>
using namespace std;
const int MAX_N = 100004;
int N, M;
int A[MAX_N];
inline void Update(int pos, int val){
int Nr0 = 0;
while(pos <= N){
A[pos] += val;
while(!(pos & (1 << Nr0)))
++Nr0;
pos += (1 << Nr0);
++Nr0;
}
}
inline int Query(int pos){
int Nr0 = 0, Sum = 0;
while(pos > 0){
Sum += A[pos];
while(!(pos & (1 << Nr0)))
++Nr0;
pos -= (1 << Nr0);
++Nr0;
}
return Sum;
}
inline int BS(int val){
int left = 0, mid = 0, right = N+1;
while(left < right){
mid = (left+right)/2;
if(Query(mid) > val)
right = mid;
else left = mid+1;
}
if(Query(left-1) != val)
return -1;
return left-1;
}
int main(){
ifstream f("aib.in");
ofstream g("aib.out");
f >> N >> M;
for(int i = 1, x = 0; i <= N; ++i){
f >> x;
Update(i, x);
}
for(int q = 1; q <= M; ++q){
int t, p, x, a, b, Res;
f >> t;
if(!t){
f >> p >> x;
Update(p, x);
}
else if(t == 1){
f >> a >> b;
Res = Query(b) - Query(a-1);
}
else{
f >> x;
Res = BS(x);
}
if(t >= 1)
g << Res << '\n';
}
f.close();
g.close();
return 0;
}