Pagini recente » Cod sursa (job #1302696) | Cod sursa (job #1665773) | Cod sursa (job #1845230) | Cod sursa (job #225390) | Cod sursa (job #2766999)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
//FILE* si=fopen("aib.in","r");
const int nmax=100004;
ll n,m,v[nmax],a,b;
ll aib[nmax];
void update(int poz, int val)
{
int x=poz;
while(x<=n)
{
aib[x]+=val;
x+=x&(-x);
}
}
ll query(int x)
{
ll sol=0;
while(x)
{
sol+=aib[x];
x-=x&(-x);
}
return sol;
}
int main()
{
//fscanf(si,"%d%d",&n,&m);
fin>>n>>m;
for(int i=1; i<=n; i++)
{
//fscanf(si,"%d",&v[i]);
fin>>v[i];
update(i,v[i]);
}
while(m--)
{
int task;
//fscanf(si,"%d",&task);
fin>>task;
if(task==0)
{
//fscanf(si,"%d%d",&a,&b);
fin>>a>>b;
v[a]+=b;
update(a,b);
}
else if(task==1)
{
//fscanf(si,"%d%d",&a,&b);
fin>>a>>b;
fout<<query(b)-query(a-1)<<"\n";
}
else
{
//fscanf(si,"%d",&a);
fin>>a;
int st=1,dr=n+1;
int rasp=-1;
while(st<dr)
{
int mij=(st+dr)/2;
int r=query(mij);
if(r<a) st=mij+1;
else if(r==a) {
rasp=mij; break;
}
else dr=mij;
}
fout<<rasp<<"\n";
}
}
return 0;
}