Pagini recente » Cod sursa (job #582679) | Cod sursa (job #202140) | Cod sursa (job #2009241) | Cod sursa (job #1787891) | Cod sursa (job #1028032)
#include<fstream>
using namespace std;
ifstream in("aib.in"); ofstream out("aib.out");
int t,a,b,n,m,x,c[100001];
void update(int poz, int val){
for(int i=poz; i<=n; i+= (i & -i)) c[i]+=val;
}
int sum(int st, int dr){
int s=0;
for(int i=dr; i; i-=(i & -i)) s+=c[i];
for(int i=st-1; i; i-=(i & -i)) s-=c[i];
return s;
}
void query(int a){
int st=1, dr=n;
int mid,acm;
while(st<=dr){
mid=(st+dr)/2;
acm=sum(1,mid);
if(acm==a){out<<mid<<'\n'; return ;}
if(acm>a) { dr=mid-1; continue;}
else st=mid+1;
}
out<<-1<<'\n';
}//peste tot e ca la datorii, mai putin query asta. Pun k-ul la mijlocul sirului si vad suma pana la el. Daca e mai mare
//bla bla, daca e mai mic alb alb. Cautare binara :p
int main(){
in>>n>>m;
for(int i=1;i<=n;++i){ in>>x; update(i,x);}
for(int i=1;i<=m;++i){
in>>t;
if(t==2){
in>>a;
query(a);
}
else{
in>>a>>b;
if(t==0) update(a,b);
else out<<sum(a,b)<<'\n';
}
}
out.close();
return 0;
}