Pagini recente » Cod sursa (job #2429571) | Diferente pentru problema/pudge intre reviziile 9 si 8 | Cod sursa (job #1025561) | Cod sursa (job #1337575) | Cod sursa (job #1213221)
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <limits>
#include <vector>
#include <cstdlib>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, elem, query, a, b;
int aib[200001];
void update(int pos, int value){
while(pos <= n){
aib[pos] += value;
pos += (pos & (-pos));
}
}
int get(int pos) {
int sum = 0;
while(pos > 0) {
sum += aib[pos];
pos -= (pos & (-pos));
}
return sum;
}
int get_sum(int a, int b){
return get(b) - get(a-1);
}
int max_doi(int x) {
int i = 1;
while(i <= x) {
i *= 2;
}
return i;
}
int search(){
int left = 1, right = max_doi(n), g, mid = 0, sum = 0;
bool found = false;
while(left <= right && found == false){
mid = left + (right - left) / 2;
g = aib[mid];
if(g + sum == a){
found = true;
}
if(g + sum > a) {
right = mid - 1;
}else{
sum += g;
left = mid + 1;
}
}
if(found) return mid;
else return -1;
}
int main()
{
// freopen("aib.in", "r", stdin);
// freopen("aib.out", "w", stdout);
cin >> n >> m;
for(int i = 0; i < n; i++){
cin >> elem;
update(i+1, elem);
}
for(int i = 0; i < m; i++){
cin >> query;
switch(query){
case 0:
cin >> a >> b;
update(a, b);
break;
case 1:
cin >> a >> b;
cout << get_sum(a, b) <<"\n";
break;
case 2:
cin >> a;
cout << search() << "\n";
}
}
return 0;
}