Pagini recente » Cod sursa (job #875636) | Cod sursa (job #1313625) | Cod sursa (job #2910980) | Cod sursa (job #1733831) | Cod sursa (job #565612)
Cod sursa(job #565612)
#include <fstream>
#define zero(x) ((x^(x-1))&x)
#define NMax 100001
using namespace std;
fstream fin("aib.in",ios::in);
fstream fout("aib.out",ios::out);
int AIB[NMax],N,M;
void Add(int x,int val)
{
for(;x<=N;x+=zero(x))
AIB[x]+=val;
}
int Compute(int x)
{
int rez=0;
for(;x>0;x-=zero(x))
rez+=AIB[x];
return rez;
}
void Citire()
{
int i,val;
fin>>N>>M;
for(i=1;i<=N;i++)
{
fin>>val;
Add(i,val);
}
}
int Binar(int val)
{
int minK=-1,st=1,dr=N,mij,val2;
while(st<=dr)
{
mij=(st+dr)/2;
val2=Compute(mij);
if(val2==val)
{
minK=mij;
return minK;
}
else if(val2<val) //caut in dreapta
st=mij+1;
else dr=mij-1; //caut in stanga
}
return minK;
}
int main()
{
int op,st,dr,poz,val;
Citire();
while(M--)
{
fin>>op;
switch(op)
{
case 0://aduna
fin>>poz>>val;
Add(poz,val);
break;
case 1://Suma [st,dr]
fin>>st>>dr;
fout<<fout<<Compute(dr)-Compute(st-1)<<"\n";
break;
case 2://Min K
fin>>val;
fout<<Binar(val)<<"\n";
break;
}
}
return 0;
}