Pagini recente » Cod sursa (job #1815997) | Cod sursa (job #2025295) | Cod sursa (job #2883066) | Cod sursa (job #2550299) | Cod sursa (job #1141949)
#include<fstream>
#define NMAX 100010
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, aib[NMAX];
inline int ultim(int x)
{
return (x^(x-1))&x;
}
void Update(int pz, int x)
{
int i;
for (i=pz; i<=n; i+=ultim(i)) aib[i]+=x;
}
void Citeste()
{
int i, x;
f>>n>>m;
for (i=1; i<=n; ++i)
{
f>>x;
Update(i, x);
}
}
/*void Preprop()
{
int i;
for (i=1; i<=n; ++i)
aib[i]=sum[i]-sum[i-ultim(i)];
}*/
int query(int pz)
{
int i, sum=0;
for (i=pz; i>0; i-=ultim(i)) sum+=aib[i];
return sum;
}
int cauta(int x)
{
int st=1, dr=n, mij, sol=-1, val;
while (st<=dr)
{
mij=(st+dr)/2;
val=query(mij);
if (val==x)
{
sol=mij; dr=mij-1;
}
else
if (val>x) dr=mij-1;
else st=mij+1;
}
return sol;
}
void Solve()
{
int op, x, y, i;
for (i=1; i<=m; ++i)
{
f>>op;
if (op==0)
{
f>>x>>y;
Update(x, y);
}
else
if (op==1)
{
f>>x>>y;
g<<query(y)-query(x-1)<<"\n";
}
else
{
f>>x;
g<<cauta(x)<<"\n";
}
}
}
int main()
{
Citeste();
//Preprop();
Solve();
f.close();
g.close();
return 0;
}