Pagini recente » Cod sursa (job #3272818) | Cod sursa (job #2541386)
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <time.h>
#define NMAX 100001
using namespace std;
ifstream fin("qib.in");
ofstream fout("aib.out");
int v[NMAX],aib[NMAX],n;
void print(int *v,int n)
{
for(int i=1;i<=n;++i)
cout<<v[i]<<' ';
cout<<'\n';
}
void update(int index,int x)
{
for(int i=index;i<=n;i+=i&(~i+1))
{
aib[i]+=x;
}
}
int getSum(int left,int right)
{
int s1=0,s2=0;
for(int i=left-1;i>0;i-=i&(~i+1))
s1+=aib[i];
for(int i=right;i>0;i-=i&(~i+1))
s2+=aib[i];
return s2-s1;
}
int findK(int k)
{
int i=1,j=n;
while(i<=j)
{
int m=(i+j)/2;
int s=getSum(1,m);
if(s==k)
return m;
if(s<k)
i=m+1;
else
j=m-1;
}
return -1;
}
int main()
{
int q;
fin>>n>>q;
for(int i=1;i<=n;++i)
fin>>v[i];
for(int i=1;i<=n;++i)
update(i,v[i]);
while(q--)
{
int op,x,y;
fin>>op;
if(op==0)
{
fin>>x>>y;
update(x,y);
}
else if(op==1)
{
fin>>x>>y;
fout<<getSum(x,y)<<'\n';
}
else
{
fin>>x;
fout<<findK(x)<<'\n';
}
}
return 0;
}