Pagini recente » Borderou de evaluare (job #853225) | Borderou de evaluare (job #3312191) | Cod sursa (job #3364862) | Autentificare | Cod sursa (job #3364983)
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN = 100005;
int n, m;
int arr[MAXN];
int sumInt[1005];
int lenGrup;
void adauga(int a, int b) {
arr[a] += b;
int interval = (a - 1) / lenGrup;
sumInt[interval] += b;
}
int query(int a, int b) {
int suma = 0;
int intervalA = (a - 1) / lenGrup;
int intervalB = (b - 1) / lenGrup;
if (intervalA == intervalB) {
for (int i = a; i <= b; ++i)
suma += arr[i];
return suma;
}
int endGrupA = (intervalA + 1) * lenGrup;
int startGrupB = intervalB * lenGrup + 1;
for (int i = a; i <= endGrupA; ++i)
suma += arr[i];
for (int i = intervalA + 1; i < intervalB; ++i)
suma += sumInt[i];
for (int i = startGrupB; i <= b; ++i)
suma += arr[i];
return suma;
}
int cauta(int a) {
int sumaCurenta = 0;
int numGrupuri = (n - 1) / lenGrup;
for (int i = 0; i <= numGrupuri; ++i) {
if (sumaCurenta + sumInt[i] >= a) {
int st = i * lenGrup + 1;
int dr = min(n, (i + 1) * lenGrup);
for (int j = st; j <= dr; ++j) {
sumaCurenta += arr[j];
if (sumaCurenta == a)
return j;
}
return -1;
}
sumaCurenta += sumInt[i];
}
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
lenGrup = sqrt(n);
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
int interval = (i - 1) / lenGrup;
sumInt[interval] += arr[i];
}
for (int i = 1; i <= m; ++i) {
int op, a, b;
cin >> op;
if (op == 0) {
cin >> a >> b;
adauga(a, b);
}
else if (op == 1) {
cin >> a >> b;
cout << query(a, b) << "\n";
}
else {
cin >> a;
cout << cauta(a) << "\n";
}
}
return 0;
}