Pagini recente » Cod sursa (job #309953) | Cod sursa (job #1420068) | Cod sursa (job #1176931) | Cod sursa (job #1584435) | Cod sursa (job #470079)
Cod sursa(job #470079)
#include <cstdio>
#include <iostream>
using namespace std;
#define DN 100001
int c[DN],n,m;
void actualizare(int ind,int val) {
int poz=0;//pozitia celui mai nesemnificativ bit cu valoarea 1
while(ind<=n) {
c[ind]+=val;
while(!(ind&1<<poz)) ++poz;
ind+=1<<poz;
++poz;
}
}
int interogare(int dr) {
int s=0,poz=0;
while(dr>0) {
s+=c[dr];
while(!(dr&1<<poz)) ++poz;
dr-=1<<poz;
++poz;
}
return s;
}
int cautare(int val) {
int i,poz;
for(poz=1;poz<n;poz<<=1);
for(i=0; poz; poz>>=1)
if(i+poz<=n)
if(val>=c[i+poz]) {
i+=poz;
val-=c[i];
if(!val) return i;
}
return -1;
}
int main()
{
int i,val,op,a,b;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1; i<=n; i++) {
scanf("%d",&val);
actualizare(i,val);
}
while(m--) {
scanf("%d",&op);
if(op<2) {
scanf("%d %d",&a,&b);
if(!op)
actualizare(a,b);
else printf("%d\n",interogare(b)-interogare(a-1));
}
else {
scanf("%d",&a);
printf("%d\n",cautare(a));
}
}
return 0;
}