Pagini recente » Cod sursa (job #620812) | Cod sursa (job #1570565) | Cod sursa (job #1420720) | Cod sursa (job #2897573) | Cod sursa (job #2924095)
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
int n,k,S;
vector <int> aib;
int ps(int a)
{
int sum=0;
while (a>0)
{
sum+=aib[a];
a-=(a&-a);
}
return sum;
}
void update(int a, int val)
{
while (a<=n)
{
aib[a]+=val;
a+=(a&-a);
}
}
int query(int a, int b)
{
return ps(b)-ps(a-1);
}
int Search(int Sum)
{
int pos=n+1, B;
int limst=0, limdr=n+1;
B=n;
S=ps(B);
if ( S==Sum ) pos=n;
while ( B )
{
B=(limst+limdr)>>1;
S=ps(B);
if (S>Sum)
{
if (limdr>B) limdr=B;
B-=1;
}
else if (S==Sum) pos=min(pos,B), limdr=B, B-=1;
else
{
if (limst<B) limst=B;
B+=1;
}
if (B<=limst) break;
if (B>=limdr) break;
}
if (pos==n+1) return -1;
return pos;
}
int main()
{
in>>n>>k;
aib.assign(n+1, 0);
for (int i=1; i<=n; i++)
{
int x;
in>>x;
update(i,x);
}
for (int i=0; i<k; i++)
{
int cer,a,b;
in>>cer>>a;
if (cer==0)
{
in>>b;
update(a,b);
}
else if (cer==1)
{
in>>b;
out<<query(a,b)<<endl;
}
else {out<<Search(a)<<endl;}
}
return 0;
}