Pagini recente » Cod sursa (job #190834) | Cod sursa (job #1872616) | Cod sursa (job #2812188) | Cod sursa (job #692345) | Cod sursa (job #2872486)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
class aib
{
private:
vector <int> v;
int _n;
int lsb(int pos)
{
return (pos&(-pos));
}
public:
aib (int n)
{
v.resize(n+1);
_n=n;
}
void update(int pos,int val)
{
while(pos<=_n)
{
v[pos]+=val;
pos+=lsb(pos);
}
}
int query(int pos)
{
int sum=0;
while(pos>=1)
{
sum+=v[pos];
pos-=lsb(pos);
}
return sum;
}
int bs(int a)
{
int r=0,pas=1<<17,sum=0;
while(pas)
{
if(r+pas<=_n && sum+v[r+pas]<=a)
{
r+=pas;
sum+=v[r];
if(sum==a)
return r;
}
pas>>=1;
}
return -1;
}
};
int main()
{
int n,m;
in>>n>>m;
aib x(n);
for(int i=1; i<=n; i++)
{
int a;
in>>a;
x.update(i,a);
}
for(int i=1; i<=m; i++)
{
int c,a;
in>>c>>a;
if(c==0)
{
int b;
in>>b;
x.update(a,b);
}
else if(c==1)
{
int b;
in>>b;
out<<x.query(b)-x.query(a-1)<<"\n";
}
else
out<<x.bs(a)<<"\n";
}
return 0;
}