Pagini recente » Cod sursa (job #2090174) | Cod sursa (job #2933243) | Cod sursa (job #863499) | Cod sursa (job #169716) | Cod sursa (job #641798)
Cod sursa(job #641798)
#include<fstream>
#define formula(x)(x&-x)
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int t,N,M,AIB[100001],v,a,b,A,B,P,V,i,q,j;
void update(int poz,int val)
{
int i;
for(i=poz ; i <=N ; i+=formula(i))
AIB[i]+=val;
}
int querry(int a)
{
int s=0;
for(i=a;i>0;i-=formula(i))
s+=AIB[i];
return s;
}
int search(int val)
{
int steps = 1;
for(;steps < N;steps<<=1);
for(int i = 0;steps;steps>>=1)
{
if(i + steps<=N)
{
if(val >= AIB[i+steps])
{
i += steps , val -= AIB[i];
if(!val) return i;
}
}
}
return -1;
}
int main (){
f>>N>>M;
for(i=1;i<=N;i++)
{
f>>t;
update(i,t);
}
for(j=1;j<=M;j++){
f>>q;
if(q==0)
{
f>>P>>V;
update(P,V);
}
if(q==1)
{
f>>a>>b;
A=querry(a-1);
B=querry(b);
g<<B-A<<"\n";
}
if(q==2)
{
f>>V;
g<<search(V)<<'\n';
}
}
return 0;
}