Advertisement
Guest User

Untitled

a guest
May 27th, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. int INDEKS;
  6. struct punkt{
  7.     int maksi, mini, kiedy;
  8.     punkt(){
  9.         maksi = -1;
  10.         mini = 10000000;
  11.         kiedy = 0;
  12.     }
  13. };
  14.  
  15.  
  16. struct drzefko{
  17.     int wlk;
  18.     vector < punkt > tab;
  19.     vector < int > gwiazdki;
  20.     drzefko(int N){
  21.         wlk = 1;
  22.         while(wlk < N){
  23.             wlk*=2;
  24.         }
  25.         tab.resize(wlk*2);
  26.         gwiazdki.resize(wlk*2);
  27.     }
  28.  
  29.     void DodajRaz(int poz, int wart){
  30.         poz += wlk;
  31.         while(poz > 0){
  32.             tab[poz].mini = min(tab[poz].mini, wart);
  33.             tab[poz].maksi = max(tab[poz].maksi, wart);
  34.             poz/=2;
  35.         }
  36.     }
  37.  
  38.     void StracGwiazdki(int poz){
  39.         tab[poz].maksi -= gwiazdki[poz];
  40.         tab[poz].mini -= gwiazdki[poz];
  41.         gwiazdki[poz*2] += gwiazdki[poz];
  42.         gwiazdki[poz*2+1] += gwiazdki[poz];
  43.         gwiazdki[poz] = 0;
  44.  
  45.     }
  46.     void DodajNaPrzedzial(int pocz, int kon, int lw, int pw, int poz, int wart){
  47.         if (lw > kon || pw < pocz){
  48.             return;
  49.         }
  50.         else if (lw >= pocz && pw <= kon){
  51.             Dodawanie(poz, wart);
  52.         }
  53.         else{
  54.             StracGwiazdki(poz);
  55.             DodajNaPrzedzial(pocz, kon, lw, (lw+pw)/2, poz*2, wart);
  56.             DodajNaPrzedzial(pocz, kon, (pw+lw)/2+1, pw, poz*2+1, wart);
  57.         }
  58.     }
  59.  
  60.  
  61.     void Dodawanie(int poz, int wart){
  62.         if (poz < wlk){
  63.             StracGwiazdki(poz);
  64.         }
  65.  
  66.         if (tab[poz].maksi <= wart && tab[poz].kiedy == 0){
  67.             tab[poz].kiedy = INDEKS;
  68.  
  69.             tab[poz].maksi = -1;
  70.             tab[poz].mini = 100000000;
  71.             poz/=2;
  72.             while(poz > 0){
  73.                 tab[poz].mini = min(tab[poz*2].mini, tab[poz*2+1].mini);
  74.                 tab[poz].maksi = max(tab[poz*2].maksi, tab[poz*2+1].maksi);
  75.                 poz/=2;
  76.             }
  77.         }
  78.         else if (tab[poz].maksi > wart && tab[poz].mini <= wart){
  79.             Dodawanie(poz*2, wart);
  80.             Dodawanie(poz*2+1, wart);
  81.         }
  82.         else{
  83.             gwiazdki[poz]+=wart;
  84.         }
  85.     }
  86.  
  87.     void DodajNaPrzedzialKrot(int pocz, int kon, int x){
  88.         DodajNaPrzedzial(pocz, kon, 0, wlk-1, 1, x);
  89.     }
  90.  
  91.     int ZwrocCzas(int poz){
  92.         poz+=wlk;
  93.         while(tab[poz].kiedy == 0 && poz > 0){
  94.             poz/=2;
  95.         }
  96.         return tab[poz].kiedy;
  97.     }
  98.  
  99. };
  100.  
  101. int main(){
  102.  
  103.     int n, m;
  104.     cin >> n >> m;
  105.     drzefko D(n);
  106.     for (int i = 0; i< n; i++){
  107.         int x;
  108.         cin >> x;
  109.         D.DodajRaz(i, x);
  110.     }
  111.  
  112.     for (int i = 0; i<m; i++){
  113.         int p, k, v;
  114.         cin >> p >> k >> v;
  115.         p--;
  116.         k--;
  117.         INDEKS++;
  118.         D.DodajNaPrzedzialKrot(p, k, v);
  119.     }
  120.  
  121.     for (int i = 0; i<n; i++){
  122.         int czas =  D.ZwrocCzas(i);
  123.  
  124.         if (czas == 0){
  125.             cout << "NIE\n";
  126.         }
  127.         else{
  128.             cout << czas << "\n";
  129.         }
  130.  
  131.     }
  132.  
  133.  
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement