Submission #180365

#TimeUsernameProblemLanguageResultExecution timeMemory
180365FieryPhoenixWall (IOI14_wall)C++11
100 / 100
2996 ms125436 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <queue>
#include <set>
#include <iomanip>
#include <deque>
#include <cassert>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <chrono>
#include <ctime>
#include <random>
#include <stack>
using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
typedef long double ld;
#define INF 2001001001
#define MOD 1000000007

struct LazySegmentTree{
  int siz;
  vector<ll>tree,lazyAdd,lazySub;
  LazySegmentTree(int temp){
    siz=temp;
    while ((siz&(siz-1))!=0) siz++;
    for (int i=0;i<siz*2;i++){
      tree.push_back(0);
      lazyAdd.push_back(-INF);
      lazySub.push_back(INF);
    }
  }
  void calc(int node){
    tree[node]=max(tree[node],lazyAdd[node]);
    tree[node]=min(tree[node],lazySub[node]);
  }
  void propagate(int node, int L, int R){
    calc(node);
    if (L!=R){
      calc(node*2);
      calc(node*2+1);
      applySub(node*2,lazySub[node]);
      applyAdd(node*2,lazyAdd[node]);
      applySub(node*2+1,lazySub[node]);
      applyAdd(node*2+1,lazyAdd[node]);
      calc(node*2);
      calc(node*2+1);
    }
    lazyAdd[node]=-INF;
    lazySub[node]=INF;
  }
  void applyAdd(int node, ll x){
    if (x>lazyAdd[node]){
      lazyAdd[node]=x;
      lazySub[node]=max(lazySub[node],x);
    }
  }
   void applySub(int node, ll x){
    if (x<lazySub[node]){
      lazySub[node]=x;
      lazyAdd[node]=min(lazyAdd[node],x);
    }
  }
  void update(int node, int L, int R, int i, int j, ll x, int type){
    propagate(node,L,R);
    if (L>R || L>j || R<i)
      return;
    if (L>=i && R<=j){
      if (type==1)
	applyAdd(node,x);
      else
	applySub(node,x);
      propagate(node,L,R);
      return;
    }
    update(node*2,L,(L+R)/2,i,j,x,type);
    update(node*2+1,(L+R)/2+1,R,i,j,x,type);
    //tree[node]=tree[node*2]+tree[node*2+1];
  }
  ll query(int node, int L, int R, int i,int j){
    if (L>R || L>j || R<i)
      return 0;
    propagate(node,L,R);
    //cout<<"QPOP "<<node<<endl;
    if (L>=i && R<=j){
      //cout<<"FOUND "<<node<<endl;
      return tree[node];
    }
    ll q1=query(node*2,L,(L+R)/2,i,j);
    ll q2=query(node*2+1,(L+R)/2+1,R,i,j);
    return q1+q2;
  }
  ll query(int i, int j){ return query(1,0,siz-1,i,j); }
  void update(int i, int j, ll val, int type){ update(1,0,siz-1,i,j,val,type); }
};

void buildWall(int N, int K, int op[], int l[], int r[], int h[], int finalh[]){
  LazySegmentTree lst=LazySegmentTree(N);
  for (int i=0;i<K;i++){
    lst.update(l[i],r[i],h[i],op[i]);
    /*
    bool debug=false;
    if (debug){
      cout<<"BEFORE: "<<endl;
      for (int j=1;j<lst.siz*2;j++)
	cout<<j<<": "<<lst.lazyAdd[j]<<' '<<lst.lazySub[j]<<endl;
    }
    for (int j=0;j<N;j++)
      cout<<lst.query(j,j)<<' ';
    cout<<endl;
    if (debug){
      cout<<"AFTER: "<<endl;
      for (int j=1;j<lst.siz*2;j++)
	cout<<j<<": "<<lst.lazyAdd[j]<<' '<<lst.lazySub[j]<<endl;
    }
    */
  }
  for (int i=0;i<N;i++)
    finalh[i]=lst.query(i,i);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...