Pagini recente » Cod sursa (job #2982264) | Cod sursa (job #395872) | Cod sursa (job #2346670) | Cod sursa (job #1410136) | Cod sursa (job #908624)
Cod sursa(job #908624)
#include <fstream>
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int N,Q,i;
int X[100001];
int C[100001];
int p,t,tip,a,b;
// determina 2^p, p fiind cel mai dinspre dreapta bit egal cu 1
int f(int x)
{
return x & (x^(x-1));
}
// determina suma X[1]+X[2]+...+X[p]
int s(int p)
{
int suma=0;
while (p!=0)
{
suma+=C[p];
p-=f(p);
}
return suma;
}
int bs(int a)
{
int st,dr,mij,su;
st=1;dr=N;
while(st<=dr)
{
mij=(st+dr)/2;
su=s(mij);
if(su==a) return mij;
if(su<a) st=mij+1;
else dr=mij-1;
}
return -1;
}
int main()
{
fi>>N>>Q;
for (i=1;i<=N;i++)
{
fi>>X[i];
p=i;
while (p<=N)
{
C[p]+=X[i];
p=p+f(p);
}
}
for (t=1;t<=Q;t++)
{
fi>>tip;
if (tip==0)
{
fi>>a>>b;
p=a;
while (p<=N)
{
C[p]+=b;
p=p+f(p);
}
}
if (tip==1)
{
fi>>a>>b;
fo<<s(b)-s(a-1)<<"\n";
}
if(tip==2)
{
fi>>a;
fo<<bs(a)<<'\n';
}
}
fi.close();
fo.close();
return 0;
}