Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // Iloczyn skalarny
- //
- // Created by Jędrzej Dudzicz on 07/04/2019.
- // Copyright © 2019 Jędrzej Dudzicz. All rights reserved.
- //
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <utility>
- #include <cmath>
- using namespace std;
- typedef long long LL;
- const int MXN=1e5+5;
- const int PIER=317;
- const LL MOD=1e9+7;
- struct wezel{
- int asum,bsum;
- int wynik,acaly,bcaly;
- };
- int n,q;
- int indeks[MXN];
- wezel pom[PIER];
- //LL tab[MXN][PIER][4];
- char znak;
- int a,b,c,nr_paczki;
- LL tab[MXN][3];
- int main(){
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cin>>n>>q;
- for(int i=1;i<=n;i++){
- if((i-1)%PIER==0){
- nr_paczki++;
- }
- indeks[i]=nr_paczki;
- }
- for(int i=0;i<=nr_paczki;i++){
- pom[i].wynik=0;
- pom[i].asum=0;
- pom[i].bsum=0;
- pom[i].acaly=0;
- pom[i].bcaly=0;
- }
- for(int ii=0;ii<q;ii++){
- cin>>znak;
- if(znak=='*'){// ( A )
- cin>>a>>b>>c;
- if(indeks[a]==indeks[b]){
- int curr=indeks[a];
- int ind1,ind2,p1,k1;
- pom[curr].wynik=0;
- p1=(curr-1)*PIER+1;
- k1=(curr)*PIER;
- for(int i=p1;i<=k1;i++)tab[i][0]+=pom[curr].acaly;
- ind1=a-(curr-1)*PIER;
- ind2=b-(curr-1)*PIER;
- for(int i=ind1;i<=ind2;i++)tab[i][0]+=c;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik+=tab[i][0]*tab[i][1];
- pom[curr].asum+=tab[i][0];
- }
- pom[curr].acaly=0;
- }
- else if(indeks[a]!=indeks[b]){
- int curr=indeks[a],curr1=indeks[b];
- int ind1,ind2,p1,k1;
- pom[curr].wynik=0;
- p1=(curr-1)*PIER+1;
- k1=(curr)*PIER;
- for(int i=p1;i<=k1;i++)tab[i][0]+=pom[curr].acaly;
- ind1=a;
- ind2=(curr)*PIER;
- for(int i=a;i<=ind2;i++)tab[i][0]+=c;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik+=tab[i][0]*tab[i][1];
- pom[curr].asum+=tab[i][0];
- }
- pom[curr].acaly=0;
- curr++;
- while(curr<curr1){
- pom[curr].asum+=c;
- pom[curr].acaly+=c;
- pom[curr].wynik+=pom[curr].bsum*c;
- curr++;
- }
- if(curr==curr1){
- pom[curr].wynik=0;
- p1=(curr-1)*PIER+1;
- k1=(curr)*PIER;
- for(int i=p1;i<=k1;i++)tab[i][0]+=pom[curr].acaly;
- ind1=a;
- ind2=(curr)*PIER;
- for(int i=a;i<=ind2;i++)tab[i][0]+=c;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik+=tab[i][0]*tab[i][1];
- pom[curr].asum+=tab[i][0];
- }
- pom[curr].acaly=0;
- }
- }
- }
- else if(znak=='.'){// ( B )
- cin>>a>>b>>c;
- if(indeks[a]==indeks[b]){
- int curr=indeks[a];
- int ind1,ind2,p1,k1;
- pom[curr].wynik=0;
- p1=(curr-1)*PIER+1;
- k1=(curr)*PIER;
- for(int i=p1;i<=k1;i++)tab[i][1]+=pom[curr].bcaly;
- ind1=a-(curr-1)*PIER;
- ind2=b-(curr-1)*PIER;
- for(int i=ind1;i<=ind2;i++)tab[i][1]+=c;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik+=tab[i][0]*tab[i][1];
- pom[curr].bsum+=tab[i][1];
- }
- pom[curr].bcaly=0;
- }
- else if(indeks[a]!=indeks[b]){
- int curr=indeks[a],curr1=indeks[b];
- int ind1,ind2,p1,k1;
- pom[curr].wynik=0;
- p1=(curr-1)*PIER+1;
- k1=(curr)*PIER;
- for(int i=p1;i<=k1;i++)tab[i][1]+=pom[curr].bcaly;
- ind1=a;
- ind2=(curr)*PIER;
- for(int i=a;i<=ind2;i++)tab[i][1]+=c;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik+=tab[i][0]*tab[i][1];
- pom[curr].bsum+=tab[i][1];
- }
- pom[curr].bcaly=0;
- curr++;
- while(curr<curr1){
- pom[curr].bsum+=c;
- pom[curr].bcaly+=c;
- pom[curr].wynik+=pom[curr].asum*c;
- curr++;
- }
- if(curr==curr1){
- pom[curr].wynik=0;
- p1=(curr-1)*PIER+1;
- k1=(curr)*PIER;
- for(int i=p1;i<=k1;i++)tab[i][1]+=pom[curr].bcaly;
- ind1=a;
- ind2=(curr)*PIER;
- for(int i=a;i<=ind2;i++)tab[i][1]+=c;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik+=tab[i][0]*tab[i][1];
- pom[curr].bsum+=tab[i][1];
- }
- pom[curr].bcaly=0;
- }
- }
- }
- else{
- cin>>a>>b;
- LL ans=0;
- int curr=indeks[a],curr1=indeks[b];
- int ind1,ind2;
- if(curr==curr1){
- ind1=a-(curr-1)*PIER;
- ind2=b-(curr-1)*PIER;
- for(int i=ind1;i<=ind2;i++)ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
- }
- else if(curr!=curr1){
- ind1=a;
- ind2=(curr)*PIER;
- for(int i=ind1;i<=ind2;i++)ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
- curr++;
- while(curr<curr1){
- ans+=pom[curr].wynik;
- curr++;
- }
- if(curr==curr1){
- ind1=a;
- ind2=(curr)*PIER;
- for(int i=ind1;i<=ind2;i++)ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
- }
- }
- cout<<ans%MOD<<endl;
- }
- }
- return 0;
- }
- /*
- 5 4
- * 1 4 10
- . 2 5 8
- ? 1 3
- ? 2 5
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement