Pagini recente » Cod sursa (job #263002) | Cod sursa (job #3159906) | Cod sursa (job #979182) | Cod sursa (job #881068) | Cod sursa (job #2686202)
//ALEXANDRU MICLEA
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>
#include <assert.h>
using namespace std;
using ll = long long;
#include <fstream>
//ifstream cin("input.in"); ofstream cout("output.out");
ifstream cin("aib.in"); ofstream cout("aib.out");
//VARIABLES
const int MAXM = 150005;
const int MAXN = 100005;
int n, m;
int v[MAXN];
vector <int> BIT(MAXN);
//FUNCTIONS
void update(int pos, int val){
for (int i = pos; i <= n; i += i & -i){
BIT[i] += val;
}
return;
}
int query (int st, int dr){
int L = 0, R = 0;
for (int i = st - 1; i; i -= i & -i) L += BIT[i];
for (int i = dr; i; i -= i & -i) R += BIT[i];
return R - L;
}
int caut_bin(int val){
int st = 1;
int dr = n;
int ans = -1;
while(st <= dr){
int mid = st + dr;
mid /= 2;
int res = query(1, mid);
if (res == val){
ans = mid;
break;
}
if (res > val) dr = mid - 1;
else st = mid + 1;
}
return ans;
}
//MAIN
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> v[i];
update(i, v[i]);
}
for (int i = 1; i <= m; i++){
int tip; cin >> tip;
if (tip == 0){
int a, b; cin >> a >> b;
update(a, b);
}
if (tip == 1){
int a, b; cin >> a >> b;
cout << query(a, b) << '\n';
}
if (tip == 2){
int a; cin >> a;
cout << caut_bin(a) << '\n';
}
}
return 0;
}