Pagini recente » Cod sursa (job #1241944) | Cod sursa (job #1776792) | Cod sursa (job #303931) | Cod sursa (job #1704466) | Cod sursa (job #566554)
Cod sursa(job #566554)
#include<cstdio>
#define nmax 100001
using namespace std;
int N,M,a[nmax];
void sum(int in,int val);
void solve();
int inv(int in,int sf);
int dets(int in);
int search(int val);
int main()
{
freopen ("aib.in","r",stdin);
freopen ("aib.out","w",stdout);
solve();
return 0;
}
void solve()
{
int i,c,val,in,sf;
scanf("%d%d",&N,&M);
for (i=1;i<=N;++i)
{
scanf("%d",&c);
sum(i,c);
}
for (i=1;i<=M;++i)
{
scanf("%d",&c);
if (!c)
{
scanf("%d%d",&in,&val);
sum(in,val);
}
else if (c==1)
{
scanf("%d%d",&in,&sf);
printf("%d\n",inv(in,sf));
}
else
{
scanf("%d",&in);
printf("%d\n",search(in));
}
}
}
void sum(int in,int val)
{
int poz=0;
while(in<=N)
{
a[in]+=val;
while (!(in&1<<poz)) poz++;
in+=1<<poz;
poz++;
}
}
int inv(int in,int sf)
{
int s1=dets(sf);
int s2=dets(in-1);
return s1-s2;
}
int dets(int in)
{
int s=0,poz=0;
while (in)
{
s+=a[in];
while(!(in&1<<poz)) ++poz;
in-=1<<poz;
++poz;
}
return s;
}
int search(int val)
{
int poz,i;
for (poz=1;poz<N;poz<<=1);
for (i=0;poz;poz>>=1)
{
if (i+poz<=N)
{
if (val>=a[i+poz])
{
i+=poz;
val-=a[i];
if (!val) return i;
}
}
}
return -1;
}