<pre name="code" class="cpp">#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100005
using namespace std;
struct node{
int l,r,sum;
int sett;
}tree[N<<2];
int a[N];
int ans;
void build(int m,int l,int r){
tree[m].l = l;
tree[m].r = r;
tree[m].sett = -1;
if(l == r){
tree[m].sum = a[l];
return;
}
int mid = (l+r)>>1;
build(m<<1,l,mid);
build((m<<1)+1,mid+1,r);
tree[m].sum = tree[m<<1].sum + tree[(m<<1)+1].sum;
}
void pushdown(int m){
if(tree[m].l >= tree[m].r)
return;
if(tree[m].sett != -1){
tree[m<<1].sett = tree[(m<<1)+1].sett = tree[m].sett;
tree[m<<1].sum = (tree[m<<1].r-tree[m<<1].l+1)*tree[m].sett;
tree[(m<<1)+1].sum = (tree[(m<<1)+1].r-tree[(m<<1)+1].l+1)*tree[m].sett;
tree[m].sett = -1;
}
}
void maintain(int m){
tree[m].sum = tree[m<<1].sum + tree[(m<<1)+1].sum;
}
void update(int m,int l,int r,int val){
if(tree[m].l >= l && tree[m].r <= r){
tree[m].sett = val;
tree[m].sum = (tree[m].r-tree[m].l+1)*val;
return;
}
pushdown(m);
int mid = (tree[m].l+tree[m].r)>>1;
if(l <= mid)
update(m<<1,l,r,val);
if(mid < r)
update((m<<1)+1,l,r,val);
maintain(m);
}
void query(int m,int l,int r){
if(tree[m].l >= l && tree[m].r <= r){
ans += tree[m].sum;
return;
}
pushdown(m);
int mid = (tree[m].l+tree[m].r)>>1;
if(l <= mid)
query(m<<1,l,r);
if(mid < r)
query(m<<1|1,l,r);
maintain(m);
}
int main(){
int n,m;
while(~scanf("%d",&n)){
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
build(1,1,n);
scanf("%d",&m);
int op,a,b,c;
for(int i = 1; i <= m; i++){
scanf("%d",&op);
if(op == 0){
ans = 0;
scanf("%d%d",&a,&b);
query(1,a,b);
printf("%d\n",ans);
}
else{
scanf("%d%d%d",&a,&b,&c);
update(1,a,b,c);
}
}
}
return 0;
}