Advertisement
Guest User

Untitled

a guest
May 26th, 2018
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <string>
  5. using namespace std;
  6.  
  7. struct punkt{
  8.     long long pocz, kon;
  9.     long long suma;
  10. };
  11.  
  12.  
  13. vector < punkt > drzewo;
  14. int wlk = 1;
  15. void Dodaj(int poz, long long wart1, long long wart2){
  16.     poz+=wlk;
  17.     drzewo[poz].kon += wart1;
  18.     drzewo[poz].pocz += wart2;
  19.     poz/=2;
  20.     while(poz>0){
  21.         drzewo[poz].pocz = drzewo[poz*2].pocz;
  22.         drzewo[poz].kon = drzewo[poz*2+1].kon;
  23.         drzewo[poz].suma = drzewo[poz].pocz * drzewo[poz].kon + drzewo[poz*2].suma + drzewo[poz*2 + 1].suma;
  24.         drzewo[poz].pocz += drzewo[poz*2+1].pocz;
  25.         drzewo[poz].kon += drzewo[poz*2].kon;
  26.         poz/=2;
  27.     }
  28. }
  29.  
  30. void Zmien(int poz){
  31.     poz+=wlk;
  32.     if (drzewo[poz].pocz == 1){
  33.         Dodaj(poz-wlk, 1, -1);
  34.     }
  35.     else{
  36.         Dodaj(poz-wlk, -1, 1);
  37.     }
  38. }
  39.  
  40.  
  41. long long sumcia(int lew, int praw){
  42.     lew+=wlk;
  43.     praw+=wlk;
  44.     long long ilezlewej = 0;
  45.     long long ilezprawej = 0;
  46.     long long wynik = 0;
  47.     while(lew != praw){
  48.         if (lew % 2 == 1){// czyli jest prawym synem
  49.             wynik+=drzewo[lew].suma;
  50.             wynik+=drzewo[lew].kon*ilezlewej;
  51.             ilezlewej+=drzewo[lew].pocz;
  52.             lew++;
  53.         }
  54.         if (praw % 2 == 0){
  55.             wynik+=drzewo[praw].suma;
  56.             wynik+=drzewo[praw].pocz*ilezprawej;
  57.             ilezprawej+=drzewo[praw].kon;
  58.             praw--;
  59.         }
  60.         if (lew - 1  == praw){
  61.             lew--;
  62.         }
  63.         else{
  64.             praw/=2;
  65.             lew/=2;
  66.         }
  67.     }
  68.  
  69.     return wynik + ilezlewej*ilezprawej;
  70.  
  71. }
  72.  
  73. int main(){
  74.     int N;
  75.     int Q;
  76.     cin >> N >> Q;
  77.  
  78.     while(wlk <= N){wlk*=2;}
  79.     drzewo.resize(wlk*2);
  80.     string slowo;
  81.     cin >> slowo;
  82.     for (int i = 0; i < N; i++){
  83.         if(slowo[i] == 'P'){
  84.             Dodaj(i, 0, 1);
  85.         }
  86.         else{
  87.             Dodaj(i, 1, 0);
  88.         }
  89.     }
  90.    // cout << drzewo[1].suma << "\n";
  91.     for (int i = 0; i < Q; i++){
  92.         char wybor;
  93.         cin >> wybor;
  94.         if (wybor == 'X'){
  95.             int poz;
  96.             cin >> poz;
  97.             poz--;
  98.             Zmien(poz);
  99.         }
  100.         else{
  101.             int poz1, poz2;
  102.             cin >> poz1 >> poz2;
  103.             poz1--; poz2--;
  104.             cout << sumcia(poz1, poz2, 0, wlk-1, 1);
  105.         }
  106.     }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement