Pagini recente » Cod sursa (job #1093932) | Cod sursa (job #1279344) | Cod sursa (job #2859261) | Cod sursa (job #2149608) | Cod sursa (job #455563)
Cod sursa(job #455563)
#include<fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
#define nmax 100002
int n,m,st,dr,poz,ad;
long long s[nmax],bla;
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;
}
void initializare()
{
f>>n>>m;
int i,k,x;for(i=1;i<=n;i++)
{
f>>x;
k=0;
while((i&(1<<k))==0)
k++;
s[i]=suma(i-1)-suma(i-(1<<k))+x;
}
}
void operatia_0()
{
int k=0;
while(poz<=n)
{
s[poz]+=ad;
while((poz&(1<<k))==0) k++;
poz+=(1<<k);k++;
}
}
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;
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';
}
}
}