Pagini recente » Cod sursa (job #1096927) | Cod sursa (job #2843930) | Cod sursa (job #2083649) | Cod sursa (job #2565868) | Cod sursa (job #1139543)
#include<cstdio>
#define zero(x) ((x^(x-1))&x)
using namespace std;
int i, aib[100005], n, s, op, x, y, k, st, dr, mij, nr;
bool ok;
void add(int poz){
int i;
for (i=poz;i<=n;i+=zero(i))
aib[i]+=x;
}
int suma(int x){
int i, s= 0;
for (i=x;i>0;i-=zero(i))
s+=aib[i];
return s;
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d", &n, &k);
for (i=1;i<=n;i++) {
scanf("%d", &x); add(i);
}
for (i=1;i<=k;i++) {
scanf("%d", &op);
if (op==0) {scanf("%d%d", &y, &x); add(y); continue;}
if (op==1) {scanf("%d%d", &x, &y); s=suma(y)-suma(x-1); printf("%d\n", s); continue;}
if (op==2) {
st=1; dr=n; scanf("%d", &nr); ok=false;
for (mij=(st+dr)/2;st<dr;mij=(st+dr)/2) {
s=suma(mij); if (s==nr) {printf("%d\n", mij); ok=true; break;}
if (s<nr) st=mij+1; else dr=mij-1;
}
if (ok==false) {
if (suma(st)==nr) printf("%d\n", st);
else printf("-1\n");
}
}
}
return 0;
}