Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <ctype.h>
- #define BAZA 10
- #define MAXBUF 4096
- #define MAXN 1000000
- #define MAXT 2097152
- char buf[MAXBUF];
- int a, b, val, ans[MAXN+1], v[MAXT], poz=MAXBUF;
- FILE *fin, *fout;
- inline char nextch(){
- if(poz==MAXBUF){
- fread(buf, 1, MAXBUF, fin);
- poz=0;
- }
- return buf[poz++];
- }
- inline int numar(){
- int x=0;
- char ch=nextch();
- while(!isdigit(ch)){
- ch=nextch();
- }
- while(isdigit(ch)){
- x=(x<<3)+(x<<1)+ch-'0';
- ch=nextch();
- }
- return x;
- }
- inline void putch(char ch){
- buf[poz++]=ch;
- if(poz==MAXBUF){
- fwrite(buf, 1, MAXBUF, fout);
- poz=0;
- }
- }
- inline void baga(int x){
- int cif[BAZA], k=0, t;
- do{
- t=x/BAZA;
- cif[k++]=x-(t<<3)-(t<<1);
- x=t;
- }while(x);
- while(k){
- putch(cif[--k]+'0');
- }
- }
- void dfs(int t, int st, int dr){
- if(st==dr){
- ans[st]=v[t];
- return ;
- }
- int m=st+(dr-st)/2, fiust=2*t+1, fiudr=2*t+2;
- if(v[t]!=0){
- if(v[t]>v[fiust]){
- v[fiust]=v[t];
- }
- if(v[t]+m+1-st>v[fiudr]){
- v[fiudr]=v[t]+m+1-st;
- }
- }
- dfs(fiust, st, m);
- dfs(fiudr, m+1, dr);
- }
- void update(int t, int st, int dr){
- if((st>=a)&&(dr<=b)){
- if(v[t]<val+st-a){
- v[t]=val+st-a;
- }
- return ;
- }
- int m=st+(dr-st)/2, fiust=2*t+1, fiudr=2*t+2;
- if(v[t]!=0){
- if(v[t]>v[fiust]){
- v[fiust]=v[t];
- }
- if(v[t]+m+1-st>v[fiudr]){
- v[fiudr]=v[t]+m+1-st;
- }
- }
- if(m>=a){
- update(fiust, st, m);
- }
- if(m+1<=b){
- update(fiudr, m+1, dr);
- }
- }
- int main(){
- int n, m, i;
- fin=fopen("trade.in", "r");
- fout=fopen("trade.out", "w");
- fscanf(fin, "%d%d ", &n, &m);
- for(i=0; i<m; i++){
- a=numar();
- b=numar();
- val=numar();
- update(0, 1, n);
- }
- dfs(0, 1, n);
- poz=0;
- for(i=1; i<n; i++){
- baga(ans[i]);
- putch(' ');
- }
- baga(ans[n]);
- putch('\n');
- fwrite(buf, 1, poz, fout);
- fclose(fin);
- fclose(fout);
- return 0;
- }
- ////////////////////////////////////////////////
- #include <fstream>
- #include <algorithm>
- using namespace std;
- const int N = 1000005;
- struct Trader{
- int x, y, val;
- Trader(){
- x = y = 0;
- }
- Trader(int _x, int _y, int _val){
- x = _x;
- y = _y;
- val = _val;
- }
- inline bool operator<(const Trader& T) const{
- return val < T.val;
- }
- };
- class Pmd{
- int T[N];
- public:
- inline int tata(int x){
- if (x == T[x])
- return x;
- return T[x] = tata(T[x]);
- }
- void reset(int size){
- for (int i = 1 ; i <= size ; i++)
- T[i] = i;
- }
- void merge(int x, int y){
- x = T[x];
- y = T[y];
- T[x] = y;
- }
- };
- int v[N], n, m;
- Trader a[N];
- Pmd A;
- ifstream in("trade.in");
- ofstream out("trade.out");
- int main(){
- int x, y, z;
- in >> n >> m;
- for (int i = 1 ; i <= m ; i++){
- in >> x >> y >> z;
- a[i] = Trader(x, y, z - x);
- }
- sort(a + 1, a + m + 1);
- A.reset(n + 1);
- for (int i = m ; i ; i--)
- for (int j = A.tata(a[i].x) ; j <= a[i].y ; j = A.tata(j + 1)){
- v[j] = j + a[i].val;
- A.merge(j, a[i].y + 1);
- }
- for (int i = 1 ; i <= n ; i++)
- out << v[i] << " ";
- out << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement