Pagini recente » Cod sursa (job #688695) | Cod sursa (job #865023) | Cod sursa (job #3125273) | Cod sursa (job #2345509) | Cod sursa (job #3214230)
#include <bits/stdc++.h>
#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
///#include <tryhardmode>
///#include <GODMODE::ON>
using namespace std;
#define cin fin
#define cout fout
ifstream fin ("aib.in");
ofstream fout ("aib.out");
const int NMAX=1e5+5;
long long saiz;
int aib[NMAX];
int v[NMAX];
int n;
int lsb(int x)
{
return x&(-x);
}
void update(int p,int val)
{
while(p<=n)
{
aib[p]+=val;
p+=lsb(p);
}
}
long long query(int p)
{
long long s=0;
while(p>0)
{
s+=aib[p];
p-=lsb(p);
}
return s;
}
long long solve_q(int x,int y)
{
return query(y)-query(x-1);
}
int search_poz(int val)
{
int i,p=0,s=0;
for(i=saiz;i>0;i/=2)
{
if(i+p<=n)
{
if(s+aib[i+p]<val)
{
s+=aib[i+p];
p+=i;
}
}
}
if(s+v[p+1]!=val)
return -1;
return p+1;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int q,i,j;
cin>>n>>q;
for(i=1;i<=n;i++)
{
cin>>v[i];
update(i,v[i]);
}
saiz=(1<<__lg(n));
while(q--)
{
int type,x,y;
cin>>type;
if(type==0)
{
cin>>x>>y;
update(x,y);
v[x]+=y;
}
else if(type==1)
{
cin>>x>>y;
cout<<solve_q(x,y)<<"\n";
}
else
{
cin>>x;
cout<<search_poz(x)<<"\n";
}
}
cin.close();
cout.close();
return 0;
}