Pagini recente » Cod sursa (job #1885875) | Cod sursa (job #2831430) | Cod sursa (job #2385035) | Cod sursa (job #1700456) | Cod sursa (job #455561)
Cod sursa(job #455561)
#include<fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
#define nmax 100002
int n,m,v[nmax],st,dr,poz,ad;
long long s[nmax],bla;
void citire()
{
f>>n>>m;int i;
for(i=1;i<=n;i++) f>>v[i];
}
void initializare()
{
int i,k;for(i=1;i<=n;i++)
{
k=0;
while((i&(1<<k))==0)
k++;
int ss=0;
for(k=i-(1<<k)+1;k<=i;k++)
ss+=v[k];
s[i]=ss;
}
}
void operatia_0()
{
int k=0;
while(poz<=n)
{
s[poz]+=ad;
while((poz&(1<<k))==0) k++;
poz+=(1<<k);k++;
}
}
long long suma(int ind)
{
long long sum=0;int k=0;
while(ind)
{
sum+=s[ind];
while((ind&(1<<k))==0) k++;
ind-=(1<<k);k++;
}
return sum;
}
long long operatia_1()
{
st--;
return suma(dr)-suma(st);
}
int operatia_2()
{
st=1;dr=n;int mij;
while(st<dr)
{
mij=(st+dr)/2;
if(suma(mij)>=bla)
dr=mij;
else
st=mij+1;
}
if(suma(st)==bla)
return st;
return -1;
}
int main()
{
int x;
citire();initializare();
for(;m;--m)
{
f>>x;
if(x==0)
{
f>>poz>>ad;
operatia_0();
}
if(x==1)
{
f>>st>>dr;
g<<operatia_1()<<'\n';
}
if(x==2)
{
f>>bla;
g<<operatia_2()<<'\n';
}
}
}