Pagini recente » Cod sursa (job #745809) | Cod sursa (job #2916930) | Cod sursa (job #2044177) | Cod sursa (job #2783833) | Cod sursa (job #782355)
Cod sursa(job #782355)
#include<fstream>
using namespace std;
int c[1000],n,i,x,m;
void update(int ind,int val)
{
int k=0;
while(ind<=n)
{
c[ind]+=val;
while(!(ind & 1<<k)) k++;
ind+=(1<<k);
k++;
}
}
int sum(int ind)
{
int s=0,k;
while(ind>0)
{
s+=c[ind];
while(!(ind & 1<<k)) k++;
ind-=(1<<k);
k++;
}
return s;
}
int Sum_a(int a)
{
int s=0,k,poz=0;
bool ok=1;
while(ok)
{
k=-1;
ok=0;
while(s+c[poz+(1<<(k+1))]<=a && poz+(1<<(k+1))<=n)
{
k++;
ok=1;
}
if(k!=-1)
{
s+=c[poz+(1<<k)];
poz+=(1<<k);
}
}
if(s-a==0 && a!=0) return poz;
else return -1;
}
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
in>>n>>m;
int a,beg,end;
for(i=1;i<=n;i++)
c[i]=0;
for(i=1;i<=n;i++)
{
in>>x;
update(i,x);
}
while(m)
{
in>>x;
if(x==0)
{
in>>i>>a;
update(i,a);
}
else
if(x==1)
{
in>>beg>>end;
out<<sum(end)-sum(beg-1)<<endl;
}
else
if(x==2)
{
in>>a;
out<<Sum_a(a)<<endl;
}
m--;
}
return 0;
}