Pagini recente » Cod sursa (job #1625653) | Cod sursa (job #1559216) | Cod sursa (job #2142043) | Cod sursa (job #1899033) | Cod sursa (job #1897028)
#include <fstream>
#include <iostream>
#define maxs 100005
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int AIB[maxs], v, n, m;
void Add(int x, int quantity){
int i;
for (i = x; i <= n; i += zeros(i))
AIB[i] += quantity;
}
int Compute(int x){
int i, ret = 0;
for (i = x; i > 0; i -= zeros(i))
ret += AIB[i];
return ret;
}
int Search(int val){
int i, step;
for ( step = 1; step < n; step <<= 1 );
for( i = 0; step; step >>= 1 ){
if( i + step <= n){
if( val >= AIB[i+step] ){
i += step, val -= AIB[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main(){
f >> n >> m;
for(int i = 1; i <= n; ++i){
f >> v, Add(i, v);
}
for(int i = 1; i <= m; ++i){
int k, x, y;
f >> k;
if(!k){
f >> x >> y;
Add(x, y);
}
else if(k == 1){
f >> x >> y;
g << Compute(y) - Compute(x-1) << '\n';
}
else if(k == 2){
int found = 0;
f >> x;
g << Search(x) << '\n';
}
}
}