Pagini recente » Cod sursa (job #370903) | Cod sursa (job #2849418) | Cod sursa (job #2399726) | Cod sursa (job #142212) | Cod sursa (job #3319822)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> v;
int n, m;
int lsb (int x){
return (x & -x);
}
void update(int pos, int val){
for(int i = pos; i <= n; i+= lsb(i)){
v[i] += val;
//cout << i << " " << lsb(i) << endl;
//if(i ==0 )
// break;
}
}
int query(int pos){
int s = 0;
for(int i = pos; i > 0; i-= lsb(i))
s+= v[i];
return s;
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
fin >> n >> m;
v.resize(n + 1);
for(int i = 1; i <= n ; i++){
int nr;
fin>>nr;
update(i, nr);
}
for(int i = 0; i < m; i++){
int cer;
fin >> cer;
if(cer == 0){
int pos, val;
fin >> pos >> val;
update(pos, val);
}
if(cer == 1){
int pos1, pos2;
fin >>pos1 >> pos2;
fout << query(pos2) - query (pos1 - 1) << '\n';
}
if(cer == 2){
int x;
fin >> x;
int ans = 0;
int sum = 0;
for(int pas = (1 << 17); pas > 0; pas /= 2){
if(ans + pas <= n && sum + v[ans + pas] < x){
ans += pas;
sum += v[ans];
}
}
fout << ans + 1<< '\n';
/*for(int i = 1; i<= n; i++)
if(query(i)== x){
fout << i << endl;
break;
}*/
}
}
return 0;
}