Pagini recente » Cod sursa (job #55392) | Cod sursa (job #652098) | Cod sursa (job #1318985) | Cod sursa (job #1714774) | Cod sursa (job #174447)
Cod sursa(job #174447)
#include<stdio.h>
long x[100001],n,m,i,val,ad,poz,cod,st,dr,s,salt,saltmax,ok;
int main()
{
freopen("aib.in","rt",stdin);
freopen("aib.out","wt",stdout);
scanf("%ld%ld",&n,&m);
saltmax=1;
while(saltmax<n)saltmax<<=1;
for(i=1;i<=n;i++)
{ scanf("%ld",&val);
poz=i;
for(ad=1;poz<=n;ad<<=1)
if(ad&poz){x[poz]+=val;poz+=ad;}
}
for(;m;m--)
{ scanf("%ld",&cod);
if(!cod)
{ scanf("%ld%ld",&poz,&val);
for(ad=1;poz<=n;ad<<=1)
if(ad&poz){x[poz]+=val;poz+=ad;}
continue;
}
if(cod==1)
{ scanf("%ld%ld",&st,&dr);
s=0;
poz=dr;
for(ad=1;poz;ad<<=1)
if(ad&poz){s+=x[poz];poz-=ad;}
poz=st-1;
for(ad=1;poz;ad<<=1)
if(ad&poz){s-=x[poz];poz-=ad;}
printf("%ld\n",s);
continue;
}
scanf("%ld",&s);
if(!s){printf("0\n");continue;}
poz=0;ok=0;
for(salt=saltmax;salt;salt>>=1)
{ if(poz+salt<=n)
if(s>=x[poz+salt])
{poz+=salt;s-=x[poz];}
if(!s)
{printf("%ld\n",poz);ok=1;break;}
}
if(!ok)printf("-1\n");
}
fcloseall();
return 0;
}