Pagini recente » Cod sursa (job #3003852) | Cod sursa (job #323716) | Cod sursa (job #522439) | Cod sursa (job #2445228) | Cod sursa (job #854668)
Cod sursa(job #854668)
#include <fstream>
#include <iostream>
#define nmax 15001
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int v[nmax];
int smen[150];
int n,m;
int rada=0;
void get_data(){
in>>n>>m;
for (int i=1;i<=n;i++)
in>>v[i];
}
int radacina(int n){
int i=1;
while (i*i<=n) i++;
/*if (i*i==n) return i ;
else */return --i;
}
void transform(){
int i,j;
j=1;
for (i=1;i<=n;i++){
smen[j]+=v[i];
if (i==j*rada)
j++;
}
}
void refresh(int a, int suma){
v[a]-=suma;
int ok=0;//inca nu. am gasit zona
int i=1;//suntem in zona 1
while (ok==0){
if (i*i<a) i++;
else
if (i*i==a) {
ok=1;
smen[i]-=suma;
}
else
if (i*i>a){
ok=1;
smen[i-1]-=suma;
}
}
}
int ask(int x, int y) { //suma din intervalul x,y
int st=1;
int zona=1;
int suma=0;
int dr=rada+st-1;
int x1,y1;
while (st<=n){
if (st>=x) x1=st; //.x..st=x1
else x1=x; /// st..x=x1
if (dr<=y) y1=dr; //y2=dr...y
else y1=y; ///y2=y....dr
if (y1>n) y1=n;
if ((x1==st) && (y1==dr)) suma+=smen[zona];
else
{
for(int j=x1;j<=y1;j++) suma+=v[j];
}
st=dr+1;
dr+=rada;
zona++;
}
return suma;
}
int main()
{ int a,b,op;
get_data();
rada=radacina(n);
transform();
for (int i=1;i<=n;i+=rada){
cout<<smen[i]<<' ';
}
for (int i=1;i<=m;i++){
in>>op>>a>>b;
if (op==0) refresh(a,b);
else out<<ask(a,b)<<'\n';
}
return 0;
}