Pagini recente » Cod sursa (job #3249425) | Cod sursa (job #2903412) | Cod sursa (job #113147) | Cod sursa (job #1538352) | Cod sursa (job #639832)
Cod sursa(job #639832)
#include <fstream>
#define zeros(x) x&(-x)
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int st,N,M,AIB[100002];
void adauga(int p,int val)
{
for(;p<=N;p+=zeros(p))
AIB[p]+=val;
}
inline int query(int p)
{
int S=0;
for(;p;p-=zeros(p))
S+=AIB[p];
return S;
}
inline int BS(int key)
{
int i,step=st;
if(key==0)return -1;
for(i=0;step;step>>=1)
{
if(i+step<=N&&key>=AIB[i+step])
key-=AIB[i+step],i+=step;
if(key==0)//am gasit o solutie
return i;
}
return -1;
}
int main()
{
int a,b,c,q,i;
in>>N>>M;
for(i=1;i<=N;i++)
in>>c,adauga(i,c);
for(st=1;st<N;st<<=1);//pentru cautarea binara
while(M--)
{
in>>q;
if(q==0)//lui a ii adaug valoarea c
{
in>>a>>c;
adauga(a,c);
}
if(q==1)//suma valorilor din intervalul [a,b];
{
in>>a>>b;
out<<query(b)-query(a-1)<<'\n';
}
if(q==2)//determin pozitia minima k astfel incat suma valorilor primilor k termeni sa fie exact a
{
in>>a;
out<<BS(a)<<'\n';
}
}
return 0;
}