Cod sursa(job #2502876)
Utilizator | Data | 1 decembrie 2019 19:04:22 | |
---|---|---|---|
Problema | Arbori indexati binar | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.32 kb |
#include <fstream>
#include <math.h>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n,m,r,v[100005];
struct nod{
int a,b;
long long sum;
}s[400];
int main(){
int i,j,k,c,a,b;
long long x,y;
cin>>n>>m;
r=sqrt(n);
for(i=1;i<=n;i++)cin>>v[i];
for(j=1,x=0,k=0,i=1;i<=n;i++){
x+=v[i];
if(i%r==0 || i==n){
k++; s[k].a=j; s[k].b=i; s[k].sum=x;
j=i+1;x=0;
}
}
while(m){
cin>>c;
if(c==0){
cin>>a>>b;
v[a]+=b;
i=1+(a-1)/r;
x=0;
for(j=s[i].a;j<=s[i].b;j++){
x+=v[j];
}
s[i].sum=x;
}
if(c==1){
cin>>a>>b;
i=1+(a-1)/r;
j=1+(b-1)/r;
if(i==j){
x=0;
while(a<=b){
x+=v[a];
a++;
}
cout<<x<<"\n";
}
else{
x=0;
while(a<=s[i].b){
x+=v[a];
a++;
}
i++;
while(i<j){
x+=s[i].sum;
i++;
}
a=s[j].a;
while(a<=b){
x+=v[a];
a++;
}
cout<<x<<"\n";
}
}
if(c==2){
cin>>y;
if(y==0){
if(v[1]==0)cout<<"0\n";
else cout<<"-1\n";
}
else{
x=0;
for(i=1;i<=k;i++){
x=x+s[i].sum;
if(x>=y)break;
}
if(x<y)cout<<"-1\n";
else{
j=s[i].b;
while(j>=s[i].a && x>=y){
x=x-v[j];
j--;
}
if(x<y){
j++;
x+=v[j];
}
if(x==y)cout<<j<<"\n";
else cout<<"-1\n";
}
}
}
m--;
}
cin.close(); cout.close();
return 0;
}