Pagini recente » Cod sursa (job #2818137) | Cod sursa (job #2238988) | Cod sursa (job #2687286) | Cod sursa (job #1280553) | Cod sursa (job #216288)
Cod sursa(job #216288)
#include <cstdio>
#include <algorithm>
using namespace std;
int a, b, c, i, j, n, m, rez;
int v[100100], x[100100];
int lsb(int x) {
return (x&(x-1))^x;
}
void update(int a, int b) {
while (a<=n) {
x[a] += b;
a += lsb(a);
}
}
int query(int a) {
int r=0;
while (a) {
r += x[a];
a -= lsb(a);
}
return r;
}
int bsearch(int l, int r) {
int m = (l + r) / 2, p = query(m);
if ( p == b )
return m;
if (l>=r)
return -1;
if (p < b)
return bsearch(m+1, r);
else
return bsearch(l, m-1);
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d", &n, &m);
for (i=1; i<=n; i++) {
scanf("%d", &v[i]);
update(i, v[i]);
}
for (i=1; i<=m; i++) {
scanf("%d%d", &a, &b);
rez=0;
if (a==0) {
scanf("%d", &c);
update(b, c);
}
if (a==1) {
scanf("%d", &c);
rez = query(c) - query(b-1);
}
if (a==2)
rez = bsearch(1, n);
if (rez == 0)
rez = -1;
if (a)
printf("%d\n", rez);
}
return 0;
}