Advertisement
jedrzejd

Untitled

Apr 8th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.30 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  Iloczyn skalarny
  4. //
  5. //  Created by Jędrzej Dudzicz on 07/04/2019.
  6. //  Copyright © 2019 Jędrzej Dudzicz. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <cstdio>
  11. #include <algorithm>
  12. #include <utility>
  13. #include <cmath>
  14. using namespace std;
  15. typedef long long LL;
  16. const int MXN=1e5+5;
  17. const int PIER=317;
  18. const LL MOD=1e9+7;
  19. struct wezel{
  20.     int asum,bsum;
  21.     int wynik,acaly,bcaly;
  22. };
  23. int n,q;
  24. int indeks[MXN];
  25. wezel pom[PIER];
  26. //LL tab[MXN][PIER][4];
  27. char znak;
  28. int a,b,c,nr_paczki;
  29. LL tab[MXN][3];
  30. int main(){
  31.     ios_base::sync_with_stdio(0);
  32.     cin.tie(0);
  33.     cout.tie(0);
  34.     cin>>n>>q;
  35.     for(int i=1;i<=n;i++){
  36.         if((i-1)%PIER==0){
  37.             nr_paczki++;
  38.         }
  39.         indeks[i]=nr_paczki;
  40.     }
  41.     for(int i=0;i<=nr_paczki;i++){
  42.         pom[i].wynik=0;
  43.         pom[i].asum=0;
  44.         pom[i].bsum=0;
  45.         pom[i].acaly=0;
  46.         pom[i].bcaly=0;
  47.     }
  48.     for(int ii=0;ii<q;ii++){
  49.         cin>>znak;
  50.         if(znak=='*'){//               ( A )
  51.             cin>>a>>b>>c;
  52.             if(indeks[a]==indeks[b]){
  53.                 int curr=indeks[a];
  54.                 int ind1,ind2,p1,k1;
  55.                 pom[curr].wynik=0;
  56.                 p1=(curr-1)*PIER+1;
  57.                 k1=(curr)*PIER;
  58.                 for(int i=p1;i<=k1;i++)tab[i][0]+=pom[curr].acaly;
  59.                 ind1=a-(curr-1)*PIER;
  60.                 ind2=b-(curr-1)*PIER;
  61.                 for(int i=ind1;i<=ind2;i++)tab[i][0]+=c;
  62.                 for(int i=p1;i<=k1;i++){
  63.                     pom[curr].wynik+=tab[i][0]*tab[i][1];
  64.                     pom[curr].asum+=tab[i][0];
  65.                 }
  66.                 pom[curr].acaly=0;
  67.             }
  68.            
  69.             else if(indeks[a]!=indeks[b]){
  70.                 int curr=indeks[a],curr1=indeks[b];
  71.                 int ind1,ind2,p1,k1;
  72.                 pom[curr].wynik=0;
  73.                 p1=(curr-1)*PIER+1;
  74.                 k1=(curr)*PIER;
  75.                 for(int i=p1;i<=k1;i++)tab[i][0]+=pom[curr].acaly;
  76.                 ind1=a;
  77.                 ind2=(curr)*PIER;
  78.                 for(int i=a;i<=ind2;i++)tab[i][0]+=c;
  79.                 for(int i=p1;i<=k1;i++){
  80.                     pom[curr].wynik+=tab[i][0]*tab[i][1];
  81.                     pom[curr].asum+=tab[i][0];
  82.                 }
  83.                 pom[curr].acaly=0;
  84.                 curr++;
  85.                 while(curr<curr1){
  86.                     pom[curr].asum+=c;
  87.                     pom[curr].acaly+=c;
  88.                     pom[curr].wynik+=pom[curr].bsum*c;
  89.                     curr++;
  90.                 }
  91.                 if(curr==curr1){
  92.                     pom[curr].wynik=0;
  93.                     p1=(curr-1)*PIER+1;
  94.                     k1=(curr)*PIER;
  95.                     for(int i=p1;i<=k1;i++)tab[i][0]+=pom[curr].acaly;
  96.                     ind1=a;
  97.                     ind2=(curr)*PIER;
  98.                     for(int i=a;i<=ind2;i++)tab[i][0]+=c;
  99.                     for(int i=p1;i<=k1;i++){
  100.                         pom[curr].wynik+=tab[i][0]*tab[i][1];
  101.                         pom[curr].asum+=tab[i][0];
  102.                     }
  103.                     pom[curr].acaly=0;
  104.                 }
  105.             }
  106.         }
  107.         else if(znak=='.'){//         ( B )
  108.             cin>>a>>b>>c;
  109.             if(indeks[a]==indeks[b]){
  110.                 int curr=indeks[a];
  111.                 int ind1,ind2,p1,k1;
  112.                 pom[curr].wynik=0;
  113.                 p1=(curr-1)*PIER+1;
  114.                 k1=(curr)*PIER;
  115.                 for(int i=p1;i<=k1;i++)tab[i][1]+=pom[curr].bcaly;
  116.                 ind1=a-(curr-1)*PIER;
  117.                 ind2=b-(curr-1)*PIER;
  118.                 for(int i=ind1;i<=ind2;i++)tab[i][1]+=c;
  119.                 for(int i=p1;i<=k1;i++){
  120.                     pom[curr].wynik+=tab[i][0]*tab[i][1];
  121.                     pom[curr].bsum+=tab[i][1];
  122.                 }
  123.                 pom[curr].bcaly=0;
  124.             }
  125.             else if(indeks[a]!=indeks[b]){
  126.                 int curr=indeks[a],curr1=indeks[b];
  127.                 int ind1,ind2,p1,k1;
  128.                 pom[curr].wynik=0;
  129.                 p1=(curr-1)*PIER+1;
  130.                 k1=(curr)*PIER;
  131.                 for(int i=p1;i<=k1;i++)tab[i][1]+=pom[curr].bcaly;
  132.                 ind1=a;
  133.                 ind2=(curr)*PIER;
  134.                 for(int i=a;i<=ind2;i++)tab[i][1]+=c;
  135.                 for(int i=p1;i<=k1;i++){
  136.                     pom[curr].wynik+=tab[i][0]*tab[i][1];
  137.                     pom[curr].bsum+=tab[i][1];
  138.                 }
  139.                 pom[curr].bcaly=0;
  140.                 curr++;
  141.                 while(curr<curr1){
  142.                     pom[curr].bsum+=c;
  143.                     pom[curr].bcaly+=c;
  144.                     pom[curr].wynik+=pom[curr].asum*c;
  145.                     curr++;
  146.                 }
  147.                 if(curr==curr1){
  148.                     pom[curr].wynik=0;
  149.                     p1=(curr-1)*PIER+1;
  150.                     k1=(curr)*PIER;
  151.                     for(int i=p1;i<=k1;i++)tab[i][1]+=pom[curr].bcaly;
  152.                     ind1=a;
  153.                     ind2=(curr)*PIER;
  154.                     for(int i=a;i<=ind2;i++)tab[i][1]+=c;
  155.                     for(int i=p1;i<=k1;i++){
  156.                         pom[curr].wynik+=tab[i][0]*tab[i][1];
  157.                         pom[curr].bsum+=tab[i][1];
  158.                     }
  159.                     pom[curr].bcaly=0;
  160.                 }
  161.             }
  162.         }
  163.         else{
  164.             cin>>a>>b;
  165.             LL ans=0;
  166.             int curr=indeks[a],curr1=indeks[b];
  167.             int ind1,ind2;
  168.             if(curr==curr1){
  169.                 ind1=a-(curr-1)*PIER;
  170.                 ind2=b-(curr-1)*PIER;
  171.                 for(int i=ind1;i<=ind2;i++)ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
  172.             }
  173.             else if(curr!=curr1){
  174.                 ind1=a;
  175.                 ind2=(curr)*PIER;
  176.                 for(int i=ind1;i<=ind2;i++)ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
  177.                 curr++;
  178.                 while(curr<curr1){
  179.                     ans+=pom[curr].wynik;
  180.                     curr++;
  181.                 }
  182.                 if(curr==curr1){
  183.                     ind1=a;
  184.                     ind2=(curr)*PIER;
  185.                     for(int i=ind1;i<=ind2;i++)ans=ans%MOD+(tab[i][0]*tab[i][1])%MOD;
  186.                 }
  187.             }
  188.             cout<<ans%MOD<<endl;
  189.         }
  190.     }
  191.     return 0;
  192. }
  193. /*
  194. 5 4
  195. * 1 4 10
  196. . 2 5 8
  197. ? 1 3
  198. ? 2 5
  199. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement