1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=3e5+5; const int NN=6e5+5; struct Segment{ int lc,rc; LL lazy,c1,c2,d1,d2; }tr[NN];int len; void updata(int x){ tr[x].c1=tr[tr[x].lc].c1+tr[tr[x].rc].c1; tr[x].c2=tr[tr[x].lc].c2+tr[tr[x].rc].c2; } void pushlazy(int x,LL c){ tr[x].c1+=c*tr[x].d1; tr[x].c2+=c*tr[x].d2; tr[x].lazy+=c; } void pushdown(int x){ if(tr[x].lazy){ pushlazy(tr[x].lc,tr[x].lazy); pushlazy(tr[x].rc,tr[x].lazy); tr[x].lazy=0; } } int bt(int l,int r){ int x=++len; tr[x].d1=r-l+1;tr[x].d2=1ll*(r+l)*(r-l+1)/2; if(l<r){ int mid=(l+r)>>1; tr[x].lc=bt(l,mid); tr[x].rc=bt(mid+1,r); } return x; } void change(int x,int l,int r,int ll,int rr,LL c){ if(ll>rr || r<ll || l>rr)return ; if(l>=ll && r<=rr){ pushlazy(x,c); return ; } pushdown(x); int mid=(l+r)>>1; change(tr[x].lc,l,mid,ll,rr,c); change(tr[x].rc,mid+1,r,ll,rr,c); updata(x); } LL findans(int x,int l,int r,int id){ if(l>id)return 0ll; if(r<=id)return (id+1)*tr[x].c1-tr[x].c2; pushdown(x); int mid=(l+r)>>1; return findans(tr[x].lc,l,mid,id)+findans(tr[x].rc,mid+1,r,id); } int n,m,q; set<int> pos; LL V[N];bool v[N];int p[N]; int ll[N]; void modif(int l,int r,LL c){ if(l>r)return ; change(1,1,n,l,r,c); change(1,1,n,r+1,r+1,-c*(r-l+1)); } void print(){ for(int i=1;i<=n;i++){ printf("%lld ",findans(1,1,n,i)-findans(1,1,n,i-1)); } printf("\n"); } int main(){ scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=m;i++){ int x;scanf("%d",&x);x=n-x+1; v[x]=1; p[i]=x; pos.insert(x); } for(int i=1;i<=m;i++){ LL x;scanf("%lld",&x); V[p[i]]=x; } bt(1,n); int pre=1; for(int i=2;i<=n;i++){ if(!v[i])continue; ll[i]=pre;pre=i; modif(ll[i]+1,i-1,V[i]); } for(int i=1;i<=q;i++){ int t;scanf("%d",&t); if(t==1){ int x,val;scanf("%d%d",&x,&val);x=n-x+1; v[x]=1;V[x]=val;pos.insert(x); int nex=*pos.upper_bound(x); modif(ll[nex]+1,nex-1,-V[nex]); ll[x]=ll[nex]; modif(ll[x]+1,x-1,V[x]); ll[nex]=x; modif(ll[nex]+1,nex-1,V[nex]); } else{ int l,r;scanf("%d%d",&l,&r);l=n-l+1;r=n-r+1; swap(l,r); printf("%lld\n",findans(1,1,n,r)-findans(1,1,n,l-1)); } } return 0; }
|