Facebook
From Denim Tortoise, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 289
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int lmiast,lmiejsc,lzgloszen,a,b,n,p,q,tym;
  6.  
  7. vector<int> V[3],M,zmiana;
  8.  
  9. #define show if(0)
  10.  
  11. void cl(){
  12.  
  13.   V[0].clear();
  14.  
  15.   V[1].clear();
  16.  
  17.   V[2].clear();
  18.  
  19.   M.clear();
  20.  
  21.   zmiana.clear();
  22.  
  23. }
  24.  
  25. void add(int v){
  26.  
  27.   if(V[1][v]>=a&&V[2][v]<=b){
  28.  
  29.     show
  30.  
  31.       cout<<"v: "<<v<<endl;
  32.  
  33.     V[0][v]+=n;
  34.  
  35.     M[v]+=n;
  36.  
  37.     while(v>1){
  38.  
  39.       if(M[v]+V[0][v/2]>M[v/2])
  40.  
  41.         zmiana[v/2]+=M[v]+V[0][v/2]-M[v/2];
  42.  
  43.       M[v/2]=max(M[v]+V[0][v/2],M[v/2]);
  44.  
  45.       v/=2;
  46.  
  47.     }
  48.  
  49.     //M[v/4]=M[v/2]+V[0][v/4];
  50.  
  51.     return;
  52.  
  53.   }
  54.  
  55.   if(V[1][v]==V[2][v])
  56.  
  57.     return;
  58.  
  59.   if((V[1][v]+V[2][v])/2>=a&&V[1][v]<=b)
  60.  
  61.     add(2*v);
  62.  
  63.   if(V[2][v]>=a&&(V[1][v]+V[2][v])/2+1<=b)
  64.  
  65.     add(2*v+1);
  66.  
  67. }
  68.  
  69. void addm(int v){
  70.  
  71.   if(V[1][v]>=a&&V[2][v]<=b){
  72.  
  73.     show
  74.  
  75.       cout<<"addm v: "<<v<<endl;
  76.  
  77.     V[0][v]-=n;
  78.  
  79.     M[v]-=n;
  80.  
  81.     while(v>1){
  82.  
  83.       if(M[v/2]>(max(M[(v/2)*2+1],M[(v/2)*2])+V[0][v/2]))
  84.  
  85.         M[v/2]-=n;/*
  86.  
  87.       if(zmiana[v/2]>0){
  88.  
  89.         M[v/2]-=zmiana[v/2];
  90.  
  91.       }*/
  92.  
  93.     //  M[v/2]=max(M[v]+V[0][v/2],M[v/2]);
  94.  
  95.       v/=2;
  96.  
  97.     }
  98.  
  99.     //M[v/4]=M[v/2]+V[0][v/4];
  100.  
  101.     return;
  102.  
  103.   }
  104.  
  105.   if(V[1][v]==V[2][v])
  106.  
  107.     return;
  108.  
  109.   if((V[1][v]+V[2][v])/2>=a&&V[1][v]<=b)
  110.  
  111.     addm(2*v);
  112.  
  113.   if(V[2][v]>=a&&(V[1][v]+V[2][v])/2+1<=b)
  114.  
  115.     addm(2*v+1);
  116.  
  117. }
  118.  
  119. void program(){
  120.  
  121.   cin>>lmiast>>lmiejsc>>lzgloszen;
  122.  
  123.   lmiast--;
  124.  
  125.   cl();
  126.  
  127.   int pot=1;
  128.  
  129.   while(pot<lmiast)
  130.  
  131.     pot*=2;
  132.  
  133.   show
  134.  
  135.     cout<<"pot: "<<pot<<endl;
  136.  
  137.   p=pot;
  138.  
  139.   q=2*pot-1;
  140.  
  141.   V[0].push_back(-1);
  142.  
  143.   V[1].push_back(-1);
  144.  
  145.   V[2].push_back(-1);
  146.  
  147.   M.push_back(-1);
  148.  
  149.   zmiana.push_back(-1);
  150.  
  151.   tym=(q-p+1);
  152.  
  153.   for(int i=1;i<2*pot;i++){
  154.  
  155.     M.push_back(0);
  156.  
  157.     zmiana.push_back(0);
  158.  
  159.     V[0].push_back(0);
  160.  
  161.     V[1].push_back(p);
  162.  
  163.     V[2].push_back(q);
  164.  
  165.     if(q==2*pot-1){
  166.  
  167.       tym/=2;
  168.  
  169.       show
  170.  
  171.         cout<<"zmniejszenie "<<tym<<endl;
  172.  
  173.       p=pot;
  174.  
  175.       q=p+tym-1;
  176.  
  177.     }
  178.  
  179.     else{
  180.  
  181.       show
  182.  
  183.         cout<<"nie"<<tym<<endl;
  184.  
  185.       p=q+1;
  186.  
  187.       q=p+tym-1;
  188.  
  189.     }
  190.  
  191.   }
  192.  
  193.   show{
  194.  
  195.     for(int i=1;i<2*pot;i++){
  196.  
  197.       cout<<V[0][i]<<" "<<V[1][i]<<" "<<V[2][i]<<endl;
  198.  
  199.     }
  200.  
  201.   }
  202.  
  203.   for(int i=0;i<lzgloszen;i++){
  204.  
  205.     cin>>a>>b>>n;
  206.  
  207.     b--;
  208.  
  209.     a+=pot-1;
  210.  
  211.     b+=pot-1;/*
  212.  
  213.     for(int k=0;k<2*pot;k++){
  214.  
  215.       V[0][k]=0;
  216.  
  217.     }*/
  218.  
  219.     zmiana.clear();
  220.  
  221.     add(1);
  222.  
  223.     if(M[1]>lmiejsc){
  224.  
  225.       addm(1);
  226.  
  227.       cout<<"N"<<endl;
  228.  
  229.     }
  230.  
  231.     else
  232.  
  233.       cout<<"T"<<endl;
  234.  
  235.     show{
  236.  
  237.       cout<<"po zgloszeniu nr: "<<i+1<<endl;
  238.  
  239.       for(int k=1;k<2*pot;k++){
  240.  
  241.         cout<<M[k]<<" "<<V[1][k]<<" "<<V[2][k]<<" bazowe ";
  242.  
  243.         cout<<V[0][k]<<" "<<V[1][k]<<" "<<V[2][k]<<endl;
  244.  
  245.       }
  246.  
  247.     }
  248.  
  249.   }
  250.  
  251. }
  252.  
  253. int main(){
  254.  
  255.   int dane;
  256.  
  257.   cin>>dane;
  258.  
  259.   while(dane--){
  260.  
  261.     program();
  262.  
  263.   }
  264.  
  265.   return 0;
  266.  
  267. }