Pagini recente » Cod sursa (job #2055429) | Monitorul de evaluare | Cod sursa (job #132433) | Cod sursa (job #1533355) | Cod sursa (job #1577616)
#include<fstream>
using namespace std;
int n, m, i, t, a, b, p, u, mid, sol;
int v[100003];
ifstream fin("aib.in");
ofstream fout("aib.out");
void update(int x, int val){
for(; x <= n; x += (x & -x)){
v[x] += val;
}
}
int query(int x){
int sum = 0;
for(; x >= 1; x -= (x & -x)){
sum += v[x];
}
return sum;
}
int query1(int x){
int p = 0, ii = 0;;
while( (1 << (p + 1)) < n){
p++;
}
for(; p >= 0; p--){
if(v[ii + (1 << p)] < x){
x -= v[ii + (1 << p)];
ii += (1 << p);
}
}
return ii + 1;
}
int main(){
fin>> n >> m;
for(i = 1; i <= n; i++){
fin>> a;
update(i, a);
}
for(i = 1; i <= m; i++){
fin>> t;
if(t == 0){
fin>> a >> b;
update(a, b);
}
else{
if(t == 1){
fin>> a >> b;
p = query(a - 1);
u = query(b);
fout<< u - p <<"\n";
}
else{
fin>> a;
sol = query1(a);
if(query(sol) == a){
fout<< sol <<"\n";
}
else{
fout<<"-1\n";
}
}
}
}
return 0;
}