Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <vector>
- using namespace std;
- int INDEKS;
- struct punkt{
- int maksi, mini, kiedy;
- punkt(){
- maksi = -1;
- mini = 10000000;
- kiedy = 0;
- }
- };
- struct drzefko{
- int wlk;
- vector < punkt > tab;
- vector < int > gwiazdki;
- drzefko(int N){
- wlk = 1;
- while(wlk < N){
- wlk*=2;
- }
- tab.resize(wlk*2);
- gwiazdki.resize(wlk*2);
- }
- void DodajRaz(int poz, int wart){
- poz += wlk;
- while(poz > 0){
- tab[poz].mini = min(tab[poz].mini, wart);
- tab[poz].maksi = max(tab[poz].maksi, wart);
- poz/=2;
- }
- }
- void StracGwiazdki(int poz){
- tab[poz].maksi -= gwiazdki[poz];
- tab[poz].mini -= gwiazdki[poz];
- gwiazdki[poz*2] += gwiazdki[poz];
- gwiazdki[poz*2+1] += gwiazdki[poz];
- gwiazdki[poz] = 0;
- }
- void DodajNaPrzedzial(int pocz, int kon, int lw, int pw, int poz, int wart){
- if (lw > kon || pw < pocz){
- return;
- }
- else if (lw >= pocz && pw <= kon){
- Dodawanie(poz, wart);
- }
- else{
- StracGwiazdki(poz);
- DodajNaPrzedzial(pocz, kon, lw, (lw+pw)/2, poz*2, wart);
- DodajNaPrzedzial(pocz, kon, (pw+lw)/2+1, pw, poz*2+1, wart);
- }
- }
- void Dodawanie(int poz, int wart){
- if (poz < wlk){
- StracGwiazdki(poz);
- }
- if (tab[poz].maksi <= wart && tab[poz].kiedy == 0){
- tab[poz].kiedy = INDEKS;
- tab[poz].maksi = -1;
- tab[poz].mini = 100000000;
- poz/=2;
- while(poz > 0){
- tab[poz].mini = min(tab[poz*2].mini, tab[poz*2+1].mini);
- tab[poz].maksi = max(tab[poz*2].maksi, tab[poz*2+1].maksi);
- poz/=2;
- }
- }
- else if (tab[poz].maksi > wart && tab[poz].mini <= wart){
- Dodawanie(poz*2, wart);
- Dodawanie(poz*2+1, wart);
- }
- else{
- gwiazdki[poz]+=wart;
- }
- }
- void DodajNaPrzedzialKrot(int pocz, int kon, int x){
- DodajNaPrzedzial(pocz, kon, 0, wlk-1, 1, x);
- }
- int ZwrocCzas(int poz){
- poz+=wlk;
- while(tab[poz].kiedy == 0 && poz > 0){
- poz/=2;
- }
- return tab[poz].kiedy;
- }
- };
- int main(){
- int n, m;
- cin >> n >> m;
- drzefko D(n);
- for (int i = 0; i< n; i++){
- int x;
- cin >> x;
- D.DodajRaz(i, x);
- }
- for (int i = 0; i<m; i++){
- int p, k, v;
- cin >> p >> k >> v;
- p--;
- k--;
- INDEKS++;
- D.DodajNaPrzedzialKrot(p, k, v);
- }
- for (int i = 0; i<n; i++){
- int czas = D.ZwrocCzas(i);
- if (czas == 0){
- cout << "NIE\n";
- }
- else{
- cout << czas << "\n";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement