Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <string>
- using namespace std;
- struct punkt{
- long long pocz, kon;
- long long suma;
- };
- vector < punkt > drzewo;
- int wlk = 1;
- void Dodaj(int poz, long long wart1, long long wart2){
- poz+=wlk;
- drzewo[poz].kon += wart1;
- drzewo[poz].pocz += wart2;
- poz/=2;
- while(poz>0){
- drzewo[poz].pocz = drzewo[poz*2].pocz;
- drzewo[poz].kon = drzewo[poz*2+1].kon;
- drzewo[poz].suma = drzewo[poz].pocz * drzewo[poz].kon + drzewo[poz*2].suma + drzewo[poz*2 + 1].suma;
- drzewo[poz].pocz += drzewo[poz*2+1].pocz;
- drzewo[poz].kon += drzewo[poz*2].kon;
- poz/=2;
- }
- }
- void Zmien(int poz){
- poz+=wlk;
- if (drzewo[poz].pocz == 1){
- Dodaj(poz-wlk, 1, -1);
- }
- else{
- Dodaj(poz-wlk, -1, 1);
- }
- }
- long long sumcia(int lew, int praw){
- lew+=wlk;
- praw+=wlk;
- long long ilezlewej = 0;
- long long ilezprawej = 0;
- long long wynik = 0;
- while(lew != praw){
- if (lew % 2 == 1){// czyli jest prawym synem
- wynik+=drzewo[lew].suma;
- wynik+=drzewo[lew].kon*ilezlewej;
- ilezlewej+=drzewo[lew].pocz;
- lew++;
- }
- if (praw % 2 == 0){
- wynik+=drzewo[praw].suma;
- wynik+=drzewo[praw].pocz*ilezprawej;
- ilezprawej+=drzewo[praw].kon;
- praw--;
- }
- if (lew - 1 == praw){
- lew--;
- }
- else{
- praw/=2;
- lew/=2;
- }
- }
- return wynik + ilezlewej*ilezprawej;
- }
- int main(){
- int N;
- int Q;
- cin >> N >> Q;
- while(wlk <= N){wlk*=2;}
- drzewo.resize(wlk*2);
- string slowo;
- cin >> slowo;
- for (int i = 0; i < N; i++){
- if(slowo[i] == 'P'){
- Dodaj(i, 0, 1);
- }
- else{
- Dodaj(i, 1, 0);
- }
- }
- // cout << drzewo[1].suma << "\n";
- for (int i = 0; i < Q; i++){
- char wybor;
- cin >> wybor;
- if (wybor == 'X'){
- int poz;
- cin >> poz;
- poz--;
- Zmien(poz);
- }
- else{
- int poz1, poz2;
- cin >> poz1 >> poz2;
- poz1--; poz2--;
- cout << sumcia(poz1, poz2, 0, wlk-1, 1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement