Pagini recente » Cod sursa (job #2492954) | Cod sursa (job #279786) | Cod sursa (job #3256791) | Cod sursa (job #2979676) | Cod sursa (job #931765)
Cod sursa(job #931765)
#include <fstream>
#define In "aib.in"
#define Out "aib.out"
#define NMAX 100004
using namespace std;
int aib[NMAX];
/*
aib[i] este suma elementelor de la i-2^k+1 la i
unde k = numarul de zerouri terminale ale lui i
k =( i&(-i);
*/
int n;
//mareste sumele de la poz la n cu val
inline void Update(int poz,int val)
{
while(poz<=n)
{
aib[poz]+=val;
poz +=(poz&(-poz));
}
}
//returneaza suma elementelor pana la pozitia poz
inline int Query(int poz)
{
int sum = 0;
while(poz>=1)
{
sum += aib[poz];
poz -= (poz&(-poz));
}
return sum;
}
//returneaza cea mai din stanga pozitie pentru care
//suma elementelor pana la pozitia respectiva este sum
//folosind cautarea binara
inline int Bin(int sum)
{
int st=1,dr=n,mijl,s;
while(st<=dr)
{
mijl=(st+dr)>>1;
s = Query(mijl);
if(s==sum)
return mijl;
else
if(s<sum)
st =mijl+1;
else
dr = mijl-1;
}
return -1;
}
int main()
{
int i,s1,s2,x,y,m,op;
ifstream fin(In);
fin>>n>>m;
ofstream fout(Out);
for(i=1;i<=n;i++)
{
fin>>x;
Update(i,x);
}
while(m--)
{
fin>>op;
if(op<2)
{
fin>>x>>y;
if(op==0)
Update(x,y);
else
{
s1 = Query(y);
s2 = Query(x-1);
fout<<(s1-s2)<<"\n";
}
}
else
{
fin>>x;
y = Bin(x);
fout<<y<<"\n";
}
}
fin.close();
fout.close();
return 0;
}