Pagini recente » Cod sursa (job #1690003) | Cod sursa (job #1780198) | Cod sursa (job #1356718) | Cod sursa (job #2633089) | Cod sursa (job #182433)
Cod sursa(job #182433)
#include <cstdio>
#define bit(i) ((i)& (-i))
#define maxn 100001
int aib[maxn];
int n;
inline void update(int x, int v)
{
for(;x<=n;x+=bit(x)) aib[x]+=v;
}
inline int query(int x)
{
int s=0;
for(;x;x-=bit(x)) s+=aib[x];
return s;
}
inline int find(int v)
{
int i, cnt;
for(i=0, cnt=(1<<18); cnt ; cnt>>=1)
if(i+cnt<=n)
if(v>=aib[i+cnt])
i+=cnt, v-=aib[i];
if(!v) return i;
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int m,i,v, type, p, q;
scanf("%d %d\n",&n, &m);
for(i=1;i<=n;++i)
{
scanf("%d ", &v);
update(i, v);
}
while(m--)
{
scanf("%d ", &type);
if(type==0)
{
scanf("%d %d\n", &p, &q);
update(p, q);
}
if(type==1)
{
scanf("%d %d\n", &p, &q);
printf("%d\n", query(q)-query(p-1));
}
if(type==2)
{
scanf("%d\n", &p);
if(p==0) printf("-1\n");
else
printf("%d\n",find(p));
}
}
return 0;
}