Pagini recente » Rating Stefan Jieanu (Stefan101) | Cod sursa (job #672255) | Cod sursa (job #275980) | Cod sursa (job #995384) | Cod sursa (job #2528956)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int stinky[100002],n;
void add(int index, int a)
{
for(int i = index ; i<=n ; i = i + (i&(-i)))
stinky[i]+=a;
}
int afisare(int a, int b)
{
int suma1,suma2;
for(int i=b;i>=0;i=i-(i&(-i)))
suma2+=stinky[i];
for(int i=a-1;i>=0;i=i-(i&(-i)))
suma1+=stinky[i];
return suma2-suma1;
}
int minimk(int a)
{
int st=1, dr=min(a,n);
while(st<dr)
{
int mij=(st+dr)/2;
int val= afisare(1,mij);
if(val==a)
return mij;
else if(val>a)
dr=mij-1;
else
st=mij+1;
}
return -1;
}
int main()
{
int m;
fin>>n>>m;
for(int i=1;i<=n;i++)
{
int a;;
fin>>a;
add(i,a);
}
for(int i=0;i<m;i++)
{
int c,x,y;
fin>>c>>x>>y;
if(!c)
{
add(x,y);
}
else
if(c==1)
{
fout<<afisare(x,y)<<'\n';
}
else
if(c==2)
{
fout<<minimk(x)<<'\n';
}
}
return 0;
}