Pagini recente » Cod sursa (job #2847008) | Cod sursa (job #1485112) | Cod sursa (job #1018292) | Cod sursa (job #1789088) | Cod sursa (job #1166522)
// AIB - suma pe interval - < N , logN >
#include <fstream>
#define Nmax 100009
#define LSB(x) (x&(-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int N,M,AIB[Nmax],val;
inline void Update(int poz,int x)
{
for(int i=poz; i<=N; i+=LSB(i)) AIB[i]+=x;
}
inline int S(int poz)
{
int aux=0;
for(int i=poz; i>0; i-=LSB(i))
aux+=AIB[i];
return aux;
}
inline int Search(int val)
{
int pas;
for(pas=1; pas<N; pas<<=1);
for(int i=0; pas; pas>>=1)
if(i+pas<=N && AIB[i+pas]<=val)
{
i+=pas , val-=AIB[i];
if(!val)return i;
}
return -1;
}
int main()
{
f>>N>>M;
for(int i=1;i<=N;++i)
f>>val , Update(i,val);
for(int i=1;i<=M;++i)
{
int op,a,b,val,poz;
f>>op;
if(!op) f>>poz>>val , Update(poz,val);
if(op==1) f>>a>>b, g<<S(b)-S(a-1)<<'\n';
if(op==2) f>>val , g<<Search(val)<<'\n';
}
f.close();g.close();
return 0;
}