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=260;
- const LL MOD=1e9+7;
- struct wezel{
- int asum,bsum;
- int wynik,acaly,bcaly;
- };
- int n,q;
- int indeks[MXN];
- wezel pom[MXN];
- 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][1]=tab[i][1]%MOD+pom[curr].bcaly;
- pom[curr].bcaly=0;
- for(int i=p1;i<=k1;i++)tab[i][0]=tab[i][0]%MOD+pom[curr].acaly;
- ind1=a;
- ind2=b;
- for(int i=ind1;i<=ind2;i++)tab[i][0]=(tab[i][0]+c)%MOD;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik=pom[curr].wynik%MOD+(tab[i][0]*tab[i][1])%MOD;
- pom[curr].asum=pom[curr].asum%MOD+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][1]=tab[i][1]%MOD+pom[curr].bcaly;
- pom[curr].bcaly=0;
- for(int i=p1;i<=k1;i++)tab[i][0]=tab[i][0]%MOD+pom[curr].acaly;
- ind1=a;
- ind2=(curr)*PIER;
- for(int i=ind1;i<=ind2;i++)tab[i][0]=(tab[i][0]+c)%MOD;
- for(int i=p1;i<=k1;i++){
- //cout<<tab[i][0]<<" ";
- pom[curr].wynik=(pom[curr].wynik+tab[i][0]*tab[i][1])%MOD;
- pom[curr].asum=pom[curr].asum%MOD+tab[i][0];
- }
- pom[curr].acaly=0;
- //cout<<"ind1: "<<ind1<<" ind2: "<<ind2<<" p1: "<<p1<<" k1: "<<k1<<endl;
- //cout<<"curr: "<<curr<<" curr1: "<<curr1<<endl;
- //cout<<"A sum: "<<pom[curr].asum<<" A Caly: "<<pom[curr].acaly<<" Wynik: "<<pom[curr].wynik<<endl;
- curr++;
- while(curr<curr1){
- pom[curr].asum=(pom[curr].asum+c*PIER)%MOD;
- pom[curr].acaly=(pom[curr].acaly+c)%MOD;
- pom[curr].wynik=(pom[curr].wynik+pom[curr].bsum*c)%MOD;
- // cout<<"A sum: "<<pom[curr].asum<<" A Caly: "<<pom[curr].acaly<<" Wynik: "<<pom[curr].wynik<<endl;
- // cout<<"curr: "<<curr<<" curr1: "<<curr1<<endl;
- 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]=tab[i][0]%MOD+pom[curr].acaly;
- for(int i=p1;i<=k1;i++)tab[i][1]=tab[i][1]%MOD+pom[curr].bcaly;
- pom[curr].bcaly=0;
- ind1=(curr-1)*PIER+1;
- ind2=b;
- for(int i=ind1;i<=ind2;i++)tab[i][0]=(tab[i][0]+c)%MOD;
- for(int i=p1;i<=k1;i++){
- //cout<<tab[i][0]<<" ";
- pom[curr].wynik=(pom[curr].wynik+tab[i][0]*tab[i][1])%MOD;
- pom[curr].asum=(pom[curr].asum+tab[i][0])%MOD;
- }
- pom[curr].acaly=0;
- // cout<<"A sum: "<<pom[curr].asum<<" A Caly: "<<pom[curr].acaly<<" Wynik: "<<pom[curr].wynik<<endl;
- // cout<<"ind1: "<<ind1<<" ind2: "<<ind2<<" p1: "<<p1<<" k1: "<<k1<<endl;
- // cout<<"curr: "<<curr<<" curr1: "<<curr1<<endl;
- }
- }
- }
- 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][0]=(tab[i][0]+pom[curr].acaly)%MOD;
- pom[curr].acaly=0;
- for(int i=p1;i<=k1;i++)tab[i][1]=(tab[i][1]+pom[curr].bcaly)%MOD;
- ind1=a;
- ind2=b;
- for(int i=ind1;i<=ind2;i++)tab[i][1]=(tab[i][1]+c)%MOD;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik=(pom[curr].wynik+tab[i][0]*tab[i][1])%MOD;
- pom[curr].bsum=(pom[curr].bsum+tab[i][1])%MOD;
- }
- 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][0]=(tab[i][0]+pom[curr].acaly)%MOD;
- pom[curr].acaly=0;
- for(int i=p1;i<=k1;i++)tab[i][1]=(tab[i][1]+pom[curr].bcaly)%MOD;
- ind1=a;
- ind2=(curr)*PIER;
- for(int i=ind1;i<=ind2;i++)tab[i][1]=(tab[i][1]+c)%MOD;
- for(int i=p1;i<=k1;i++){
- // cout<<tab[i][0]<<" ";
- pom[curr].wynik=(pom[curr].wynik+tab[i][0]*tab[i][1])%MOD;
- pom[curr].bsum=(pom[curr].bsum+tab[i][1])%MOD;
- }
- pom[curr].bcaly=0;
- // cout<<"ind1: "<<ind1<<" ind2: "<<ind2<<" p1: "<<p1<<" k1: "<<k1<<endl;
- // cout<<"curr: "<<curr<<" curr1: "<<curr1<<endl;
- // cout<<"B sum: "<<pom[curr].bsum<<" B Caly: "<<pom[curr].bcaly<<" Wynik: "<<pom[curr].wynik<<endl;
- curr++;
- while(curr<curr1){
- pom[curr].bsum=(pom[curr].bsum+c*PIER)%MOD;
- pom[curr].bcaly=(pom[curr].bcaly+c)%MOD;
- pom[curr].wynik=(pom[curr].wynik+pom[curr].asum*c)%MOD;
- // cout<<"ind1: "<<ind1<<" ind2: "<<ind2<<" p1: "<<p1<<" k1: "<<k1<<endl;
- // cout<<"curr: "<<curr<<" curr1: "<<curr1<<endl;
- // cout<<"B sum: "<<pom[curr].bsum<<" B Caly: "<<pom[curr].bcaly<<" Wynik: "<<pom[curr].wynik<<endl;
- 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]=(tab[i][0]+pom[curr].acaly)%MOD;
- pom[curr].acaly=0;
- for(int i=p1;i<=k1;i++)tab[i][1]=(tab[i][1]+pom[curr].bcaly)%MOD;
- ind1=p1;
- ind2=b;
- for(int i=ind1;i<=ind2;i++)tab[i][1]=(tab[i][1]+c)%MOD;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik=(pom[curr].wynik+tab[i][0]*tab[i][1])%MOD;
- pom[curr].bsum=(pom[curr].bsum+tab[i][1])%MOD;
- }
- pom[curr].bcaly=0;
- // cout<<"ind1: "<<ind1<<" ind2: "<<ind2<<" p1: "<<p1<<" k1: "<<k1<<endl;
- // cout<<"curr: "<<curr<<" curr1: "<<curr1<<endl;
- // cout<<"B sum: "<<pom[curr].bsum<<" B Caly: "<<pom[curr].bcaly<<" Wynik: "<<pom[curr].wynik<<endl;
- }
- }
- }
- else{
- cin>>a>>b;
- LL ans=0;
- int curr=indeks[a],curr1=indeks[b];
- int ind1,ind2,p1,k1;
- 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]=(tab[i][0]+pom[curr].acaly)%MOD;
- tab[i][1]=(tab[i][1]+pom[curr].bcaly)%MOD;
- }
- ind1=a;
- ind2=b;
- //cout<<ind1<<" "<<ind2<<endl;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik=(pom[curr].wynik+tab[i][0]*tab[i][1])%MOD;
- }
- pom[curr].acaly=0;
- pom[curr].bcaly=0;
- //cout<<ind1<<" "<<ind2<<endl;
- for(int i=ind1;i<=ind2;i++){
- ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
- // cout<<tab[i][1]<<" ";
- }
- }
- else 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]=(tab[i][0]+pom[curr].acaly)%MOD;
- tab[i][1]=(tab[i][1]+pom[curr].bcaly)%MOD;
- }
- ind1=a;
- ind2=(curr)*PIER;
- //cout<<ind1<<" "<<ind2<<endl;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik=(pom[curr].wynik+tab[i][0]*tab[i][1])%MOD;
- }
- pom[curr].acaly=0;
- pom[curr].bcaly=0;
- for(int i=ind1;i<=ind2;i++){
- ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
- //cout<<tab[i][0]<<" ";
- }
- curr++;
- while(curr<curr1){
- ans=(ans%MOD+pom[curr].wynik%MOD)%MOD;
- 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]=(tab[i][0]+pom[curr].acaly)%MOD;
- tab[i][1]=(tab[i][1]+pom[curr].bcaly)%MOD;
- }
- ind1=(curr-1)*PIER+1;
- ind2=b;
- for(int i=p1;i<=k1;i++){
- pom[curr].wynik=(pom[curr].wynik+tab[i][0]*tab[i][1])%MOD;
- }
- pom[curr].acaly=0;
- pom[curr].bcaly=0;
- //cout<<ind1<<" "<<ind2<<endl;
- for(int i=ind1;i<=ind2;i++)ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
- }
- }
- cout<<ans%MOD<<endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement