Pagini recente » Cod sursa (job #2140046) | Cod sursa (job #2153060) | Cod sursa (job #2361642) | Cod sursa (job #1427891) | Cod sursa (job #791398)
Cod sursa(job #791398)
using namespace std;
#include<fstream>
#include<vector>
#define nmax 100001
vector<int> aib(nmax);
int n;
ofstream g("aib.out");
inline int zeros(int x)
{
int nr=0;
while(!(x&(1<<nr)))
++nr;
return nr;
}
void update(int poz,int x)
{
while(poz<=n)
{
aib[poz]+=x;
poz+=(1<<zeros(poz));
}
}
void query(int a,int b)
{
long long int s1=0,s2=0;
--a;
while(a>0)
{
s1+=aib[a];
a-=(1<<zeros(a));
}
while(b>0)
{
s2+=aib[b];
b-=(1<<zeros(b));
}
g<<s2-s1<<"\n";
}
void search(int k)
{
int i=1,j;
bool ok=true;
long long int s;
while(i<=n &&ok)
{
s=0;j=i;
while(j>0)
{
s+=aib[j];
j-=(1<<zeros(j));
}
if(s==k)
g<<i<<"\n",ok=false;
++i;
}
if(ok)
g<<-1<<"\n";
}
int main()
{
int i,m,op,a,b,k,x;
ifstream f("aib.in");
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
update(i,x);
}
for(i=1;i<=m;i++)
{
f>>op;
if(op&1)
{
f>>a>>b;
query(a,b);
}
else
if(op)
{
f>>k;
search(k);
}
else
{ f>>a>>b;
update(a,b);
}
}
f.close();
g.close();
return 0;
}