Pagini recente » Cod sursa (job #1031157) | Cod sursa (job #506800) | Cod sursa (job #3001377) | Cod sursa (job #1515794) | Cod sursa (job #943286)
Cod sursa(job #943286)
#include <cstdio>
using namespace std;
const int DMAX = 100005;
int B[DMAX * 2], L[DMAX * 2], R[DMAX * 2], V[DMAX], v1, v2, s;
void creare_arbore (int l, int r, int nod) {
if (l == r) {
B[nod] = V[l];
L[nod] = l;
R[nod] = r;
return;
}
int m = (l + r) / 2;
creare_arbore (l, m, nod * 2);
creare_arbore (m + 1, r, nod * 2 + 1);
B[nod] = B[nod * 2] + B[nod * 2 + 1];
L[nod] = l;
R[nod] = r;
}
void actualizare_arbore (int nod) {
B[nod] += v2;
if (L[nod] == R[nod])
return;
int m = (L[nod] + R[nod]) / 2;
if (v1 <= m)
actualizare_arbore (nod * 2);
else
actualizare_arbore (nod * 2 + 1);
}
int querry_1 (int nod) {
if (v1 <= L[nod] && R[nod] <= v2)
return B[nod];
if (v2 < L[nod] || v1 > R[nod])
return 0;
return querry_1 (nod * 2) + querry_1 (nod * 2 + 1);
}
void querry_2 (int nod) {
if (s + B[nod * 2] > v1)
querry_2 (nod * 2);
else
if (s + B[nod * 2] == v1) {
v2 = R[nod * 2]; return;
}
else
if (s + B[nod * 2] + B[nod * 2 + 1] > v1)
querry_2 (nod * 2 + 1);
else {
v2 = R[nod * 2 + 1]; return;
}
}
int main () {
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int N, Q, i, p;
scanf ("%d%d", &N, &Q);
for (i = 1; i <= N; ++i)
scanf ("%d", &V[i]);
creare_arbore (1, N, 1);
while (Q--) {
scanf ("%d", &p);
switch (p) {
case 0: scanf ("%d%d", &v1, &v2); actualizare_arbore (1); break;
case 1: scanf ("%d%d", &v1, &v2); printf ("%d\n", querry_1 (1)); break;
default: scanf ("%d", &v1); s = 0; v2 = 0; querry_2 (1);
if (v2)
printf ("%d\n", v2);
else
printf ("-1\n");
}
}
}