Pagini recente » Cod sursa (job #92077) | Cod sursa (job #1047361) | Cod sursa (job #2659837) | Cod sursa (job #2358625) | Cod sursa (job #2602994)
#include <stdio.h>
#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < n; i++)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int INF = 0x3f3f3f3f;
const int Nmax = 200555;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int s = 1, a[Nmax], aib[Nmax];
void add(int pos, int val) {
do {
aib[pos] += val;
pos += pos & -pos;
} while(pos <= s);
}
int prefix(int pos) {
int ans = 0;
while(pos) {
ans += aib[pos];
pos -= pos & -pos;
}
return ans;
}
int main(void) {
// freopen("aib.in", "r", stdin);
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int N, M;
fin >> N >> M;
while(s < N) { s *= 2; }
for(int i = 1; i <= N; i++) {
fin >> a[i];
int x = i;
do {
aib[x] += a[i];
x += x&(-x);
} while(x <= s);
}
int q,u,v, pos, sum;
rep(i, M) {
fin >> q;
switch(q) {
case 0:
fin >> u >> v;
add(u, v);
break;
case 1:
fin >> u >> v;
fout << (prefix(v) - prefix(u-1)) << '\n';
break;
case 2:
fin >> u;
pos = 0;
sum = 0;
for(int step = s; step; step /= 2) {
if (pos+step <= N && sum + aib[pos+step] <= u) {
sum += aib[pos+step];
pos += step;
}
}
if (u == 0 || sum != u) {
fout << -1 << '\n';
} else {
fout << pos << '\n';
}
break;
}
}
return 0;
}