Pagini recente » Cod sursa (job #2419284) | Cod sursa (job #322244) | Cod sursa (job #244561) | Cod sursa (job #2802732) | Cod sursa (job #2428708)
#include <iostream>
#include <fstream>
std::ifstream fin("aib.in");
std::ofstream fout("aib.out");
int n,m;
int bit[100500];
int v[100500];
int getParent(int a)
{
return a-(a&(-a));
}
long long getSum(int a)
{
if(a>0)
return bit[a]+ getSum(getParent(a));
return bit[a];
}
void addP(int a, int b)
{
int pos = a;
while(pos<=n)
{
bit[pos]+=b;
pos+=pos&(-pos);
}
}
int findK(int k)
{
long long pos;
for(pos=1;pos<n;pos<<=1);
if(pos>n) pos>>=1;
for(int i=0;pos>0;pos>>=1)
{
if(i+pos<=n)
{
if(bit[i+pos]<=k)
{
i+=pos;
k-=bit[i];
if(k==0) return i;
}
}
}
return -1;
}
int main()
{
fin>>n>>m;
for(int i=0;i<n;i++)
{
fin>>v[i];
addP(i+1,v[i]);
}
for(int i=0;i<m;i++)
{
int p;
fin>>p;
if(p==0)
{
int a,b;
fin>>a>>b;
addP(a,b);
}
else if(p==1)
{
int a,b;
fin>>a>>b;
fout<< getSum(b)-getSum(a-1)<<"\n";
}
else
{
int a;
fin>>a;
fout<<findK(a)<<"\n";
}
}
}