Pagini recente » Cod sursa (job #3304626) | Cod sursa (job #2721792) | Cod sursa (job #528881) | Cod sursa (job #2112692) | Cod sursa (job #3309512)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n, q;
vector<int> tree;
int lsb(int x)
{
return x&(-x);
}
void increment(int position, int value)
{
while(position <= n) {
tree[position] += value;
position += lsb(position);
}
}
int query(int position)
{
int result = 0;
while (position > 0) {
result += tree[position];
position -= lsb(position);
}
return result;
}
void read() {
in>>n>>q;
tree.resize(n+1);
int num;
for (int i=1; i<=n;i++){
in >> num;
increment(i, num);
}
}
int search(int sum) {
int l = 1, r = n, m;
while (l<r){
m = (l+r)/2;
if (query(m)<sum) {
l = m+1;
} else{
r = m;
}
}
if (query(l) == sum) {
return l;
}
return -1;
}
int main(){
read();
int c, a, b;
while(q--){
in >> c;
if (c == 0) {
in>>a>>b;
increment(a, b);
} else if( c==1 ){
in>>a>>b;
out<<query(b) - query(a-1)<<'\n';
} else if (c==2){
in>>a;
out<<search(a)<<'\n';
}
}
return 0;
}