Pagini recente » Cod sursa (job #815508) | Cod sursa (job #455121) | Cod sursa (job #430777) | Cod sursa (job #2998785) | Cod sursa (job #2173110)
#include <iostream>
#include <cstdio>
#define NMAX 100005
using namespace std;
int N, M, aib[NMAX];
int zero(int t) {
return (t ^ (t - 1)) & t;
}
void adaugareVector(int val, int poz) {
for(int i = poz; i <= N; i += zero(i)) {
aib[i] += val;
}
}
void read() {
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; ++i) {
int x;
scanf("%d", &x);
adaugareVector(x, i);
}
}
int suma(int st, int dr) {
int s1 = 0, s2 = 0;
for(int i = dr; i >= 1; i -= zero(i)) {
s1 += aib[i];
}
for(int i = st - 1; i >= 1; i -= zero(i)) {
s2 += aib[i];
}
return s1 - s2;
}
int pozMinima(int val) {
int st = 1, dr = N;
while(st <= dr) {
int mij = (st + dr) / 2;
int sum = suma(1, mij);
if(sum == val) {
return mij;
}
if(sum <= val) {
st = mij + 1;
}
else {
dr = mij - 1;
}
}
return -1;
}
void makeOperations() {
for(int i = 1; i <= M; ++i) {
int op, x, y;
scanf("%d", &op);
if(op == 0) {
scanf("%d %d", &x, &y);
adaugareVector(y, x);
}
else if(op == 1) {
scanf("%d %d", &x, &y);
int sol = suma(x, y);
printf("%d\n", sol);
}
else {
scanf("%d", &x);
int sol = pozMinima(x);
printf("%d\n", sol);
}
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
read();
makeOperations();
return 0;
}