Pagini recente » Cod sursa (job #2663373) | Cod sursa (job #524970) | Cod sursa (job #426310) | Cod sursa (job #2959965) | Cod sursa (job #2757977)
#include <stdio.h>
#include <stdint.h>
void read_int32_t(FILE *__restrict stream, int32_t *__restrict nr) {
int8_t ch;
*nr = 0;
while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
*nr *= 10;
*nr += ch - '0';
}
if (ch == '\r') {
fgetc(stream);
}
}
int32_t __inline__ lsb(int32_t x) {
return x & -x;
}
int32_t aib[100001];
int32_t n, m;
int32_t suma(int32_t p) {
int32_t s = 0;
int32_t p2;
while (p) {
p2 = lsb(p);
s += aib[p];
p -= p2;
}
return s;
}
void actualizare(int32_t p, int32_t val) {
int32_t p2;
while (p <= n) {
aib[p] += val;
p2 = lsb(p);
p += p2;
}
}
int32_t search(int32_t val) {
int32_t p = 0;
int32_t pas = 1 << 16;
while (pas) {
if (p + pas <= n && suma(p + pas) < val) {
p += pas;
}
pas /= 2;
}
if (p < n && suma(p + 1) == val) {
return p + 1;
}
return -1;
}
int main() {
FILE *__restrict in = fopen("aib.in", "r");
FILE *__restrict out = fopen("aib.out", "w");
read_int32_t(in, &n);
read_int32_t(in, &m);
{
int32_t i;
int32_t x, y;
for (i = 1; i <= n; ++i) {
read_int32_t(in, &x);
actualizare(i, x);
}
int32_t op;
for (i = 0; i < m; ++i) {
read_int32_t(in, &op);
switch (op) {
case 0:
read_int32_t(in, &x);
read_int32_t(in, &y);
actualizare(x, y);
break;
case 1:
read_int32_t(in, &x);
read_int32_t(in, &y);
fprintf(out, "%i\n", suma(y) - suma(x - 1));
break;
default:
read_int32_t(in, &x);
fprintf(out, "%i\n", search(x));
break;
}
}
}
fclose(in);
fclose(out);
return 0;
}