Advertisement
Guest User

Untitled

a guest
May 27th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 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.         else if (tab[poz].maksi > wart && tab[poz].mini <= wart){
  70.             Dodawanie(poz*2, wart);
  71.             Dodawanie(poz*2+1, wart);
  72.         }
  73.         else{
  74.             gwiazdki[poz]+=wart;
  75.         }
  76.     }
  77.  
  78.     void DodajNaPrzedzialKrot(int pocz, int kon, int x){
  79.         DodajNaPrzedzial(pocz, kon, 0, wlk-1, 1, x);
  80.     }
  81.  
  82.     int ZwrocCzas(int poz){
  83.         poz+=wlk;
  84.         while(tab[poz].kiedy == 0 && poz > 0){
  85.             poz/=2;
  86.         }
  87.         return tab[poz].kiedy;
  88.     }
  89.  
  90. };
  91.  
  92. int main(){
  93.  
  94.     int n, m;
  95.     cin >> n >> m;
  96.     drzefko D(n);
  97.     for (int i = 0; i< n; i++){
  98.         int x;
  99.         cin >> x;
  100.         D.DodajRaz(i, x);
  101.     }
  102.  
  103.     for (int i = 0; i<m; i++){
  104.         int p, k, v;
  105.         cin >> p >> k >> v;
  106.         p--;
  107.         k--;
  108.         INDEKS++;
  109.         D.DodajNaPrzedzialKrot(p, k, v);
  110.     }
  111.  
  112.     for (int i = 0; i<n; i++){
  113.         int czas =  D.ZwrocCzas(i);
  114.  
  115.         if (czas == 0){
  116.             cout << "NIE\n";
  117.         }
  118.         else{
  119.             cout << czas << "\n";
  120.         }
  121.  
  122.     }
  123.  
  124.  
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement